• .Net学习难点讨论系列15 小技巧总结


     

    1.       默认情况下想使用一些.NET Framework SDK中的命令需要”Visual Studio 200x 命令提示这个工具。如果想使传统命令提示符也支持这些命令应该怎样做呢。当然是配置环境变量。在X:\Program Files\Microsoft Visual Studio 8\VC文件夹下有一个名为vcvarsall.bat的脚本文件,运行它即可完成这个环境变量的配置。

     

    2.       checkedunchecked关键字只对整型有效,对于浮点型无效,因为浮点型始终不会出现溢出。checked对于整型溢出会引起OverflowException异常(unchecked中始终不会触发OverflowException异常)。.NET中用Int32.MaxValue表示最大值,Int32.MinValue表示最小值。在checkedMaxValue1MinValue1都会引起异常。

     

    3.       结构和类的主要区别

    结构

    是值类型还是引用类型?

    值类型

    引用类型

    实例存储于栈上还是堆上?

    结构实例称为,存储于栈上

    实例称为对象,存在于堆上

    可否声明默认构造函数?

    不可以

    可以

    声明自定义的构造函数,还会声明默认构造函数吗?

    不会

    如果在自己的构造函数中不初始化一个字段,编译器会帮助初始吗?

    不会

    可以在声明一个实例字段的同时初始化吗?

    不可以

    可以

    是否可以继承?

    不可以

    可以由基类继承

    是否可以存在析构函数?

    不可以

    可以

     

    4.       关于params参数的问题

    1)         只能在一维数组上使用params关键字,所以下面的例子无法通过编译:

    Public static int Min(params int[,] table)

    2)         不能重载一个只基于params关键字的方法。params关键字不构成方法的签名的一部分。如下面两个方法同时存在将无法通过编译:

    public static int Min(int[] paramList)

    public static int Min(params int[] paramList)

    3)         不允许refout params数组,如下面两种声明都无法通过编译

    public static int Min(ref params int[] paramList)

    public static int Min(out params int[] paramList)

    4)         params数组参数必须是方法的最后一个参数(即,每个方法的参数只能有一个params数组),如下实例将不能通过编译:

    public static int Min(params int[] paramList , int i)

    编译器会检查并拒绝任何可能有歧义的重载。例如,以下两个Min方法存在歧义;如果传递两个int参数,将无法辨别具体调用哪一个:

    public static int Min(params int[] paramList)

    public static int Min(int, params int[] paramList)

    5)         params方法总是优先于一个params方法。也就是说,如果愿意,仍然可以为普通情况创建一个方法的重载版本,如下例:

    public static int Min(int leftHandSite, int rightHandSide)

    public static int Min(params int[] paramList)

    对于Min(2,3);这种形式的调用,前者函数将优先使用。

    6)         对于params object[]这类特殊参数,其会匹配同方法名任意参数的调用。也可以不向其传递参数,或传递null。这会被作为new object[0]传入。

    7)         调用public int Process(params int[] paramList)这样含有参数为参数数组的方法,我们可以传入几个单独的int值,也可以传入一个int数组,如下两种调用方式都是有效的:

    Process(2,3,8);

    Process(new []{2,3,8});

     

    5.       sealed关键字不仅可以修饰class,也可以修饰method,这称为密封方法。一个密封类不能被派生,而一个派生类中不能覆盖密封方法。

     

    6.       C#中的default关键字

    default关键字常与泛型的类型参数一起使用,由于泛型类型只有在运行时才能确定类型,所有我们不能在编译之前确定初始化一个泛型类型的方法,如一个引用类型我们需要初始化为null,一个值类型我们需要初始化为0,这时使用default关键字就可以实现这个在运行时根据实际类型来初始化的功能。

     

    7.       判断string为空或长度为0时,不要再使用string str = string.Empty;if(str==null||str.length==0),直接使用.net2.0开始提供的新的静态方法:String.IsNullOrEmpty(str)

     

    8.       switch语句的特殊用法

    switch语句中的case(分支)数不受限制。我们可以将switch放在一个for循环内,见下面的示例代码:

     1 for (int i = 0; i < 5; i++)
     2 {
     3     switch (i)
     4     {
     5         case 1:
     6             Console.WriteLine("first");
     7             break;
     8         case 2:
     9             Console.WriteLine("second");
    10             break;
    11         //...
    12         default:
    13             Console.WriteLine("default");
    14             break;
    15     }
    16 }

     

    9.       Conditional特性

    Conditional特性允许包含或排除对一个方法的调用,Conditional特性的使用很简单:

    [Conditional(“CompileSymbol”)]

    特性的构造函数接收一个字符串。如果定义了一个这样的编译符号,编译器会包含所有调用这个方法的代码,这与普通情况一致。如果没有定义这样的编译符号,编译器会忽略代码中所有对这个方法的调用。定义编译符号需要使用条件编译#define来完成。

     

    10.   自定义Attribute的一个小技巧(来自C#图解教程)

    虽然在.NET4.0起才开始支持命名参数,但.NET2.0后在应用一个Attribute时,就可以使用类似命名参数的特性来为Attribute传入参数,如下面这个自定义Attribute

     1 public sealed class MyAttributeAttribute :Attribute
     2 {
     3     public string Description { get; set; }
     4     public string Ver { get; set; }
     5     public string Reviewer { get; set; }
     6 
     7     public MyAttributeAttribute(string desc)
     8     {
     9         Description = desc;
    10     }
    11 }

    应用这个Attribute时,我们可以以如下方式给构造函数传入参数:

    1 [MyAttribute("An excellent class", Reviewer = "lsxqw", Ver = "7.15.33")]

     

    访问自定义特性

    Type类提供了两个方法,用于访问自定义的Attribute

    IsDefined:该方法可以检测某个特性是否应用到某个类上,对于我们上面的示例,我们可以使用下面的方法进行判断:

    1 Type t = typeof (MyClass);
    2 t.IsDefined(typeof (MyAttributeAttribute), false);

    GetCustomAttribute:该方法返回应用到目标类型的特性的数组,该方法返回值为object[]对象,布尔参数指定是否搜索继承树来查找特性。

     1 static void CallWhenDone(IAsyncResult iar)
     2 {
     3     MyDel del = (MyDel)iar.AsyncState;
     4     long result = del.EndInvoke(iar);
     5 
     6     Type t = typeof(MyClass);
     7     var attrLst = t.GetCustomAttributes(false);
     8     //由于我们的例子只应用了一个特性,我们直接取数组第一项
     9     MyAttributeAttribute attribute = attrLst[0] as MyAttributeAttribute;
    10     if (null != attribute)
    11     {
    12         Console.WriteLine("{0},{1},{2}", attribute.Description, attribute.Ver, attribute.Reviewer);
    13     }
    14 }

     

     

     

  • 相关阅读:
    Windows各个文件夹介绍
    Zabbix使用外部命令fping处理ICMP ping的请求
    QT 样式表实例
    QT 样式表基础知识
    cocos2d-js入门一
    try throw catch typeid
    cocos2d-x入门三 分层设计框架
    cocos2d-x入门二 helloworld实例运行与创建
    cocos2d-x入门一
    批量操作QT UI中的控件
  • 原文地址:https://www.cnblogs.com/lsxqw2004/p/2063913.html
Copyright © 2020-2023  润新知