首先鄙视下CSDN
刚刚写了一半,点了另存为草稿,写的东西就没了..
没办法,把这种不能用常理解释的问题都归咎于人品吧...
partial:
4. 研究autoProperty.cs,完成如下工作:
a.此程序为什么不能通过编译?修改自动属性Total的定义,使程序能正常编译运行。
此题困扰了我许久,终于发现:自动属性是C#3.0中的新特性,而我刚刚用的是studio 2005编译的..
导致错误:必须声明主体,因为它未标记为 abstract 或 extern.
网上也有人遇到这个问题,但都没有解决,希望此文对大家有所帮助
只需换到studio 2008中编译,需要注意,自动属性必须同时有get和set,如果想保证属性只读的话,在set前加上private即可.
b.通过ildasm.exe查看编译生成的IL代码,了解编译器是如何为类自动添加私有字段的。
Total instance float64:
.property instance float64 Total()
{
.get instance float64 autoProperty.autoClass::get_Total()
.set instance void autoProperty.autoClass::set_Total(float64)
} // end of property autoClass::Total
<Total>k__BackingField:Total private float64:
.field private float64 '<Total>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
c.要想使Total成为一个只读的自动属性,可以采用什么方式实现?
private set;
- using System;
- using System.Collections.Generic;
- //using System.Linq;
- using System.Text;
- //这个程序无法通过编译,为什么?
- namespace autoProperty
- {
- class autoClass
- {
- public double Total { get; }
- public string Name { get; set; }
- //public autoClass(int i)
- internal void show()
- {
- Console.WriteLine("{0} {1}", Total, Name);
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- autoClass a = new autoClass();
- a.Name = "wang";
- a.show();
- Console.ReadLine();
- }
- }
- }
5. 研究sameName.cs,完成如下工作:
a.将静态函数public static void show(string s)关闭(注释掉),释放实例成员函数public void show(string s),程序会发生什么变化?据此了解当变量名与类名相同时,编译器是如何判断一个标识符是类名还是对象名的。
第35行的ClassOne由类名变成了对象名(看颜色...)
根据其后面的函数,如果该类(ClassOne)中有这样的静态函数则认为是类名,否则认为是对象名.
不知道这个这个题老师是怎么编出来的,瀑布汗...
b.将静态函数public static void show(string s)的参数去掉,程序还能通过编译吗?为什么?
不能
一个类体中不能定义两个同名的成员
包括数据成员、方法成员和类型成员
c.在一个类中允许某个字段的名称同某个方法的名称相同吗?试验一下。
不可以
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace cs037
- {
- class OneClass
- {
- int num;
- public OneClass(int i)
- {
- num = i;
- }
- /* public void show(string s)
- {
- Console.WriteLine("This is "+s);
- }*/ //释放此函数,关闭下面的静态函数,结果会怎样?
- public static void show(string s)
- {//将函数参数去掉,会发生什么
- Console.WriteLine(s);
- }
- public void show()
- {
- Console.WriteLine(num);
- }
- }
- class AnotherClass
- {
- //一个类体中不能定义两个同名的成员
- //包括数据成员、方法成员和类型成员
- // void OneClass();
- public OneClass OneClass;
- public AnotherClass(OneClass c) {
- OneClass = c;
- OneClass.show("Constructed!");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- AnotherClass a = new AnotherClass(new OneClass(3));
- a.OneClass.show();
- Console.ReadLine();
- }
- }
- }
6. 研究destructor.cs,了解C#程序的垃圾回收通常是在什么时机执行的、垃圾回收与析构函数有什么关系、以及怎样进行强制回收。
一般情况下不回收,因为回收动作很耗时,
垃圾回收即调用析构函数.
使用GC.Collect();回收,或程序退出时回收
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace cs038
- {
- class TestClass {
- public TestClass() {
- Console.WriteLine("Object has been created!");
- }
- ~TestClass() {
- Console.WriteLine("Object has been reclaimed!");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- int i = 0;
- TestClass t = new TestClass();
- t = null;
- while (i<15) {
- i++;
- Console.WriteLine(i);
- Thread.Sleep(1000);
- }
- GC.Collect();
- GC.WaitForPendingFinalizers();//挂起当前线程,直到处理终结器队列的线程清空该队列为止
- Console.ReadLine();
- }
- }
- }
7. 研究staticMem.cs,仔细研究几个静态构造函数的执行顺序。了解类是在什么时候加载的,类的静态成员何时获得空间,何时执行类的静态构造函数。
运行结果
static A()
static B()
X = 1, Y = 2
程序中有注释,不说了
- /**************************************************
- * 静态字段空间的分配和静态构造函数的执行是两回事
- * 加载类时,会首先为所有静态字段分配空间,初值为0
- * 若有用户自定义或者系统生成的静态构造函数存在,则执行之
- * 程序最终运行结果是
- * X = 1, Y = 2
- ***************************************************/
- using System;
- class A
- {
- public static int X;
- static A() //④ 执行完后返回到③
- {
- X = B.Y + 1;
- Console.WriteLine("static A()");
- }
- }
- class B
- {
- public static int Y = A.X + 1; //③ 调用了A的静态成员,
- // 转到A的静态构造函数---->
- static B() //② 如果带有初始值设定项的静态字段,
- // 执行该类的静态构造函数时,
- // 先要按照文本顺序执行那些初始值设定项。
- // 转到初始值设定项---->
- {
- Console.WriteLine("static B()");
- }
- static void Main() //① 程序入口,
- // 如果类中包含用来开始执行的 Main 方法,
- // 该类的静态构造函数将在调用 Main 方法之前执行。
- // 转到B的静态构造函数---->
- {
- Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
- Console.ReadLine();
- }
- }
8. 研究cs040和cs041。完成如下的工作:
a.怎样使一个程序集变成强名称的程序集?试着用sn -k生成密钥文件,然后用该文件为程序集加密。
sn -k GACkey.snk
然后在项目属性,签名中添加
b.怎样用gacutil.exe将一个强名称的程序集部署到GAC中去?部署完成之后,亲自到/%windir%/assembly目录中去搜索程序集dll文件,看看能否找到。
c.怎样将一个程序集从GAC中卸载,与加入时候的操作有什么不同?
部署:
gacutil -i GACDemo.dll
卸载:
gacutil -u GACDemo