C#上机笔记(第六次上机)

  首先鄙视下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;
  1. using System;
  2. using System.Collections.Generic;
  3. //using System.Linq;
  4. using System.Text;
  5. //这个程序无法通过编译,为什么?
  6. namespace autoProperty
  7. {
  8.     class autoClass
  9.     {
  10.         public double Total { get; }
  11.         public string Name { getset; }
  12.         //public autoClass(int i)
  13.         internal void show()
  14.         {
  15.             Console.WriteLine("{0} {1}", Total, Name);
  16.         }
  17.     }
  18.     class Program
  19.     {
  20.         static void Main(string[] args)
  21.         {
  22.             autoClass a = new autoClass();
  23.             a.Name = "wang";
  24.             a.show();
  25.             Console.ReadLine();
  26.         }
  27.     }
  28. }

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.在一个类中允许某个字段的名称同某个方法的名称相同吗?试验一下。
不可以
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace cs037
  5. {
  6.     class OneClass
  7.     {
  8.         int num;
  9.         public OneClass(int i)
  10.         {
  11.             num = i;
  12.         }
  13. /*        public void show(string s)
  14.         {
  15.             Console.WriteLine("This is "+s);
  16.         }*/   //释放此函数,关闭下面的静态函数,结果会怎样?
  17.         public static void show(string s)
  18.         {//将函数参数去掉,会发生什么
  19.             Console.WriteLine(s);
  20.         }
  21.         public void show()
  22.         {
  23.             Console.WriteLine(num);
  24.         }
  25.     }
  26.     class AnotherClass
  27.     {
  28.         //一个类体中不能定义两个同名的成员
  29.         //包括数据成员、方法成员和类型成员
  30. //        void OneClass();
  31.         public OneClass OneClass;
  32.         public AnotherClass(OneClass c) {
  33.             OneClass = c;
  34.             OneClass.show("Constructed!");
  35.         }
  36.     }
  37.     class Program
  38.     {
  39.         static void Main(string[] args)
  40.         {
  41.             AnotherClass a = new AnotherClass(new OneClass(3));
  42.             a.OneClass.show();
  43.             Console.ReadLine();
  44.         }
  45.     }
  46. }

6. 研究destructor.cs,了解C#程序的垃圾回收通常是在什么时机执行的、垃圾回收与析构函数有什么关系、以及怎样进行强制回收。
一般情况下不回收,因为回收动作很耗时,
垃圾回收即调用析构函数.
使用GC.Collect();回收,或程序退出时回收

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using System.Threading;
  6. namespace cs038
  7. {
  8.     class TestClass {
  9.         public TestClass() {
  10.             Console.WriteLine("Object has been created!");
  11.         }
  12.         ~TestClass() {
  13.             Console.WriteLine("Object has been reclaimed!");
  14.         }
  15.     }
  16.     class Program
  17.     {
  18.         static void Main(string[] args)
  19.         {
  20.             int i = 0;
  21.             TestClass t = new TestClass();
  22.             t = null;
  23.             while (i<15) {
  24.                 i++;
  25.                 Console.WriteLine(i);
  26.                 Thread.Sleep(1000);
  27.             }
  28.             GC.Collect();
  29.             GC.WaitForPendingFinalizers();//挂起当前线程,直到处理终结器队列的线程清空该队列为止
  30.             Console.ReadLine();
  31.         }
  32.     }
  33. }

7. 研究staticMem.cs,仔细研究几个静态构造函数的执行顺序。了解类是在什么时候加载的,类的静态成员何时获得空间,何时执行类的静态构造函数。
运行结果
static A()
static B()
X = 1, Y = 2
程序中有注释,不说了
  1. /**************************************************
  2. * 静态字段空间的分配和静态构造函数的执行是两回事
  3. * 加载类时,会首先为所有静态字段分配空间,初值为0
  4. * 若有用户自定义或者系统生成的静态构造函数存在,则执行之
  5. * 程序最终运行结果是
  6. * X = 1, Y = 2
  7. ***************************************************/
  8. using System;
  9. class A
  10. {
  11.     public static int X;
  12.     static A() //④ 执行完后返回到③
  13.     {
  14.         X = B.Y + 1;
  15.         Console.WriteLine("static A()");
  16.     }
  17. }
  18. class B
  19. {
  20.     public static int Y = A.X + 1; //③ 调用了A的静态成员,
  21. // 转到A的静态构造函数---->
  22.     static B() //② 如果带有初始值设定项的静态字段,
  23. // 执行该类的静态构造函数时,
  24. // 先要按照文本顺序执行那些初始值设定项。
  25. // 转到初始值设定项---->
  26. {
  27. Console.WriteLine("static B()");
  28. }
  29. static void Main() //① 程序入口,
  30. // 如果类中包含用来开始执行的 Main 方法,
  31. // 该类的静态构造函数将在调用 Main 方法之前执行。
  32. // 转到B的静态构造函数---->
  33. {
  34. Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
  35. Console.ReadLine();
  36. }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值