1.静态变量和非静态变量的区别?

1.静态变量和非静态变量的区别?
2.const 和 static readonly 区别?
3.extern 是什么意思?
4.abstract 是什么意思?
5.internal 修饰符起什么作用?
6.sealed 修饰符是干什么的?
7.override 和 overload 的区别?
8.什么是索引指示器?
9.new 修饰符是起什么作用?
10.this 关键字的含义?
11. 可以使用抽象函数重写基类中的虚函数吗?
12.密封类可以有虚函数吗?
13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属 性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢?
14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
15.接口可以包含哪些成员?
16.类和结构的区别?
17.接口的多继承会带来哪些问题?
18. 抽象类和接口的区别?
19.别名指示符是什么?
20.如何释放非托管资源?
21.P/Invoke是什么?
22.StringBuilder 和 String 的区别?
23.explicit 和 implicit 的含义?
24.params 有什么用?
25.什 么是反射?

以下是我做的一份参考答案(C# 语言范畴之内),如果有不准确、不全面的,欢迎各位朋友指正!

 
1.静态变量和非静态变量的区别?

答:

静态变量:

静态变量使用 static 修饰符进行声明

在所属类被装载时创建

通过类进行访问

所属类的所有实例的同一静态变量都是同一个值

非静态变量:

不带有 static 修饰符声明的变量称做非静态变量

在类被实例化时创建

通过对象进行访问

同一个类的不同实例的同一非静态变量可以是不同的值

示例:

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4  
 5 namespace  Example01
 6 {
 7    class Program
 8    {
 9        class Class1
10        {
11            public static String staticStr = "Class";
12            public String notstaticStr = "Obj";
13        }

14        static void Main(string[] args)
15        {
16            //静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
17            Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);
18 
19            Class1 tmpObj1 = new Class1();
20            tmpObj1.notstaticStr = "tmpObj1";
21            Class1 tmpObj2 = new Class1();
22            tmpObj2.notstaticStr = "tmpObj2";
23 
24            //非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
25            Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);
26            Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);
27 
28            Console.ReadLine();
29        }

30    }

31}

32
33 结果:
34 Class1 ' s staticStr: Class
35 tmpObj1 ' s notstaticStr: tmpObj1
36 tmpObj2 ' s notstaticStr: tmpObj2
37

 

2.const 和 static readonly 区别?

答:

const

用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序

static readonly

用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化

示例:

测试类:

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4  
 5 namespace  Example02Lib
 6 {
 7    public class Class1
 8    {
 9        public const String strConst = "Const";
10        public static readonly String strStaticReadonly = "StaticReadonly";
11        //public const String strConst = "Const Changed";
12        //public static readonly String strStaticReadonly = "StaticReadonly Changed";
13    }

14}


客户端代码:

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4 using  Example02Lib;
 5  
 6 namespace  Example02
 7 {
 8    class Program
 9    {
10        static void Main(string[] args)
11        {
12            //修改Example02中Class1的strConst初始值后,只编译 Example02Lib项目
13            //然后到资源管理器里把新编译的Example02Lib.dll拷贝 Example02.exe所在的目录,执行Example02.exe
14            //切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!
15 
16            //可以看到strConst的输出没有改变,而strStaticReadonly的输 出已经改变
17            //表明Const变量是在编译期初始化并嵌入到客户端程序,而 StaticReadonly是在运行时初始化的
18            Console.WriteLine("strConst : {0}", Class1.strConst);
19            Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);
20 
21            Console.ReadLine();
22        }

23    }

24}

25 结果:
26 strConst : Const
27 strStaticReadonly : StaticReadonly 
28

 

修改后的示例:

测试类:

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4  
 5 namespace  Example02Lib
 6 {
 7    public class Class1
 8    {
 9        //public const String strConst = "Const";
10        //public static readonly String strStaticReadonly = "StaticReadonly";
11        public const String strConst = "Const Changed";
12        public static readonly String strStaticReadonly = "StaticReadonly Changed";
13    }

14}

15 结果
16
17 strConst : Const
18 strStaticReadonly : StaticReadonly Changed
19
20

3.extern 是什么意思?

答:

extern 修饰符用于声明由程序集外部实现的成员函数

经常用于系统API函数的调用(通过 DllImport )。注意,和DllImport一起使用时要加上 static 修饰符

也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名)

不能与 abstract 修饰符同时使用

示例:

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4 using  System.Runtime.InteropServices;
 5  
 6 namespace  Example03
 7 {
 8    class Program
 9    {
10        //注意DllImport是一个Attribute Property,在 System.Runtime.InteropServices命名空间中定义
11        //extern与DllImport一起使用时必须再加上一个static修饰符
12        [DllImport("User32.dll")]
13        public static extern int MessageBox(int Handle, string Message, string Caption, int Type);
14 
15        static int Main()
16        {
17            string myString;
18            Console.Write("Enter your message: ");
19            myString = Console.ReadLine();
20            return MessageBox(0, myString, "My Message Box"0);
21        }

22    }

23}

24 结果:
25  
26
27

 

4.abstract 是什么意思?

答:

abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员

abstract 不可以和 static 、virtual 、override 一起使用

声明为 abstract 成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承类必须实现某一成员

示例:

  1
  2 using  System;
  3 using  System.Collections.Generic;
  4 using  System.Text;
  5  
  6 namespace  Example04
  7 {
  8    基类,抽象类 基类,抽象类
  9    public abstract class BaseClass
 10    {
 11        //抽象属性,同时具有get和set访问器表示继承类必须将该属性实现为可读写
 12        public abstract String Attribute
 13        {
 14            get;
 15            set;
 16        }

 17 
 18        //抽象方法,传入一个字符串参数无返回值
 19        public abstract void Function(String value);
 20 
 21        //抽象事件,类型为系统预定义的代理(delegate):EventHandler
 22        public abstract event EventHandler Event;
 23 
 24        //抽象索引指示器,只具有get访问器表示继承类必须将该索引指示器实现为只读
 25        public abstract Char this[int Index]
 26        {
 27            get;
 28        }

 29    }

 30    #endregion

 31  
 32      继承类  继承类
 33      public  class  DeriveClass : BaseClass
 34      {
 35        private String attribute;
 36 
 37        public override String Attribute
 38        {
 39            get
 40            {
 41                return attribute;
 42            }

 43            set
 44            {
 45                attribute = value;
 46            }

 47        }

 48        public override void Function(String value)
 49        {
 50            attribute = value;
 51            if (Event != null)
 52            {
 53                Event(thisnew EventArgs());
 54            }

 55        }

 56        public override event EventHandler Event;
 57        public override Char this[int Index]
 58        {
 59            get
 60            {
 61                return attribute[Index];
 62            }

 63        }

 64    }

 65      #endregion
 66  
 67      class  Program
 68      {
 69        static void OnFunction(object sender, EventArgs e)
 70        {
 71            for (int i = 0; i < ((DeriveClass)sender).Attribute.Length; i++)
 72            {
 73                Console.WriteLine(((DeriveClass)sender)[i]);
 74            }

 75        }

 76        static void Main(string[] args)
 77        {
 78            DeriveClass tmpObj = new DeriveClass();
 79 
 80            tmpObj.Attribute = "1234567";
 81            Console.WriteLine(tmpObj.Attribute);
 82 
 83            //将静态函数OnFunction与tmpObj对象的Event事件进行关联
 84            tmpObj.Event += new EventHandler(OnFunction);
 85 
 86            tmpObj.Function("7654321");
 87 
 88            Console.ReadLine();
 89        }

 90    }

 91 }
 92 结果:
 93 1234567
 94 7
 95 6
 96 5
 97 4
 98 3
 99 2
100 1  
101
102

 

5.internal 修饰符起什么作用?

答:

internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问

接口的成员不能使用 internal 修饰符

示例

 1
 2 Example05Lib 项目的 Class1
 3
 4 using  System;
 5 using  System.Collections.Generic;
 6 using  System.Text;
 7  
 8 namespace  Example05Lib
 9 {
10    public class Class1
11    {
12        internal String strInternal = null;
13        public String strPublic;
14    }

15}

16 结果
17 Example05Lib 项目的 Class2 类可以访问到 Class1 的 strInternal 成员
18
19  
20
21 Example05 项目的 Program 类无法访问到 Class1 的 strInternal 成员
22
23  
24
25

 

6.sealed 修饰符是干什么的?

答:

sealed 修饰符表示密封

用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥

用于方法和属性时,表示该方法或属性不能再被继承,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员

通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱

恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员

示例:

 

 1
 2 using  System;
 3 using  System.Collections.Generic;
 4 using  System.Text;

你可能感兴趣的:(winform,class,string,transition,interop,c#,null)