C# 点滴

① 用showModalDialog方式打开的aspx页面,如果点击后台Button的话,会打开一个新窗口。
原因是后台控件的Button相当于<input type="submit" />,提交表单。
解决方法:在<head>中添加<base target="_self" />


② .Net自带的Ajax.dll中的默认方式为同步,所以会出现等待画面卡住的问题,只要在方法后面添加上回调函数名即可变成异步调用


③ web.Config文件中 customErrors 的配置:

很多人都遇到过明明设置了customErrors 但不起作用的情况。

一般来说都是mode的设定不正确导致的。mode可选值有On|Off|RemoteOnly。默认值是RemoteOnly。

即仅向远程客户端显示自定义错误并且向本地主机显示 ASP.NET 错误。

所以当出错的时候,在开发人员看来是无效的(开发的时候一般都会把PC当服务器用)

解决方法:只需把mode设置为ON即可  

④ 在ashx文件中使用Session

首先添加引用

using System.Web.SessionState;

实现接口

public class XXXX: IHttpHandler

==>

public class XXXX: IHttpHandler, IRequiresSessionState

完成。

使用的时候需要通过HttpContext对象调用,如

public void ProcessRequest (HttpContext hc) {

    string code = hc.Session["Cold"].ToString();

}

⑤ 获取当前的Http请求对象:

var context = System.Web.HttpContext.Current

context.Request.Params[...]

context.Response.Write(...);

⑥ 获取发送Http请求的URL

HttpUtility.UrlEncode(Request.Url.AbsoluteUri))

default的使用

default可用于多种场合,最多的是switch中,用于处理捕获不到的case。
还有一种场合就是泛型中设置初期值。

T initValue = default(T);

initValue存在两种可能的结果:引用类型的,如string,实体类等等,结果为null,其他的是0;


双问号 ?? 的用法

在实际编码中经常会对一个数据进行空值判断,从而进行相应的赋值,如

Person p = result == null?(new Person()):result;

通过??可以使这个过程变得简单。如下面三种例子:

Person p = result ?? new Person();//如果result是null,则初始化而新的Person对象



int? i = GetValue();

i = i ?? 0;//如果i是null,则初始化为0



string str = result ?? "";//如果字符串为null,则变成空字符串

as 和 is 的用法

is的用处是判断对象是否是某种类型的(或者说如果强制转换成该类型对象的话是否能成功)

bool isPerson = new object { } is Person;

as的用处是将对象强制转换成某种类型的对象,即使失败也不会发生异常,而是返回null  

string str = "X" as String;//返回X

string str2 = new object { } as String;//返回null

⑩.反射的初级应用

1.根据类名获取类实例

string className = "Company.BigProgram.BLL.TestClass";

Type type = Type.GetType(className);

if (type != null)

{

    Object obj = Activator.CreateInstance(type);

    bool b = obj is TestClass;

}

className是包含命名空间的类名
在这里只是根据类名创建了一个实例,但是没有将其转换为相应的实体类。所以一般情况 这里反射的类都应该有一个共同的接口(或者说有一个共同的父类);
这样就能很明确的创建和使用由反射得来的实体类了

//接口

namespace Company.BigProgram.BLL

{

    public interface ITest

    {

        void say(string name);

    }

}
//具体实现类

namespace Company.BigProgram.BLL

{

    public class TestClass:ITest

    {

        public void say(string name)

        {

            Console.WriteLine("看这里");

        }

    }

}
//结果输出            

string className = "ImageTest.TestClass";

Type type = Type.GetType(className);

if (type != null)

{

    ITest obj = Activator.CreateInstance(type) as ITest;

    bool b = obj is TestClass;

    MessageBox.Show(b.ToString());//True

}

2.根据实例和其属性名(字符串) 获取该属性

/// <summary>

/// 获取某个对象的某个属性值

/// </summary>

/// <param name="type">对象</param>

/// <param name="propName">属性名</param>

/// <returns>属性值</returns>

private string GetPropertyValue<T>(T item, string propName)

{

    Type type = item.GetType();//获取类型

    System.Reflection.PropertyInfo propertyInfo = type.GetProperty(propName);

    return (propertyInfo.GetValue(item, null) ?? "").ToString();

}

3.根据实例和其方法名(字符串)获取该方法并调用

private void GetPropertyValue<T>(T item, string name,object[] paras)

{

    System.Type type = item.GetType();//获取类型

    System.Reflection.MethodInfo func = type.GetMethod(name);//获取方法

    func.Invoke(item, paras);//调用 item是调用该方法的对象,paras是参数

}



private class Person

{

    public void say()

    {

        MessageBox.Show("XXXXOOOO");

    }



    public void call(string content)

    {

        MessageBox.Show(content);

    }

}

 


11.给类添加扩展方法

public class Person

{

    public Person(string name)

    {

        this.Name = name;

    }

    public string Name { set; get; }

}



public static class PersonExtension

{

    public static string Sing(this Person p, string song)

    {

        return String.Format("{0} is sing the song:{1}", p.Name, song);

    }

}





Console.WriteLine(new Person("Ray").Sing("My Love"));



==> Ray is sing the song:My Love

 

重点在PersonExtension类。这必须是个静态类,要扩展的方法也必须是静态方法

第一个参数的类型代表着要扩展的类。“this”也是必须的


 12. 给函数定义多个形参

 有的时候函数需要有多个参数,但是个数在编译时是不知道的。

解决方式:

public void ConcatObjects(params object[] objs)

{



}

///使用

public void Main()

{

    ConcatObjects("A",2,false);

}

13.using的用法

①引入命名空间  如 

using Company.Project.Common;

②在代码块结束时自动释放资源 如

using(MemoryStream s = new MemoryStream())

{

    //TO DO

}

 

 

 

 

你可能感兴趣的:(C#)