C#高级编程笔记 Day 2, 2016年8月 31日 构造函数

时间:2021-08-14 12:19:02

1、构造函数:

  实例构造函数(只要创建了对象,就会执行)一般使用 this 关键字区分成员字段和同名的参数。可以把构造函数定义为private 或 protected 。这样不相关的类也不能访问他们。

 public class MyTest{
private int i;
public MyTest(int i){
this.i=i;
}
}

  下面这个例子没有为MyTest 定义任何公有的或受保护的构造函数。这就使MyTest不能使用new 运算符在外部代码中实例化(但可以在MyNumber中编写一个公有的静态属性或方法,以实例化该类)这在下面两种情况下是有用的。

  • 类仅用作某些静态成员或属性的容器,因此永远不会实例化它
  • 希望类仅通过某个静态成员函数来实例化(这就是所谓的对象实例化的类工厂方法?)
public class MyTest{
private int i;
private Mytest(int i){
this.i=i;
}
}

  静态构造函数:编写静态构造函数的一个原因是,类有一些静态字段或属性需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。

         在C#中,通常在第一次调用类的任何成员之前执行静态构造函数。

         静态构造函数没有任何访问修饰符,在加载类时,由 .Net 运行库调用它。静态构造函数不能带任何参数,一个类只能有一个静态构造函数。

         !!无参数的实例构造函数与静态构造函数可以在同一个类中定义。

2、

 public static readonly Color BackColor;

该静态变量在静态构造函数中进行初始化,把该字段声明为只读类型表示其值只能在构造函数中设置。

3、在一个类中不同构造函数之间的相互调用。通过 this 关键词来进行调用,如果要直接对基类(父类)的构造函数进行调用,则需要使用 base 代替 this

public Car(string description,uint nwheels){
this.desprtion=desption;
this.nwheels=nwheels;
}
public Car(string description):this(description,){
//
}

4、只读字段:readonly 可以在构造函数中给其赋值,不能在其他地方。

5、【归纳实用】结构 struct :结构是值类型,不是引用类型。存储在栈中或存储为内联。

  ① 不支持继承

  ② 对于结构构造函数,编译器总是提供一个无参数的默认构造函数。  

  ③ 结构是值类型,因为结构是值类型,所以 new 运算符与类和其他引用类型的工作方式不同。new 运算符并不分配堆中的内存。而是只调用相应的构造函数,根据传送给它的参数。初始化所有字段。

  ④ 结构主要用于小的数据结构。但当把结构作为参数传递给方法时,应把它作为 ref 参数传递,以避免性能损失,此时只传递了结构在内存中的地址。

  ⑤ 结构中禁止使用无参数的构造函数。

  ★ 结构的继承链是:每个结构派生自System.ValueType类。 System.ValueType 又派生自 System.Object

  ★ 不能为结构提供其他基类,每个结构都派生自 ValueType。

struct Dimension{
public double Length=;
public double width=;
}
//编译错误:
//默认构造函数把数值字段都初始化为 0 ,把引用类型初始化为 null 且总是隐式的给出。
//提供字段的初始值也不能绕过默认构造函数。
C#高级编程笔记 Day 2, 2016年8月 31日 构造函数

6、【专题:C#中堆和栈的理解】

  Ⅰ:栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;

    堆是程序运行期间动态分配的内存空间你可以根据程序的运行情况确定要分配的堆内存大小。

  Ⅱ:存放在栈中时要管存储顺序,保持着先进后出的原则,栈是一片连续的内存域,由系统自动分配和维护。

    堆是无序的,一片不连续的内存域,由用户自己来控制和释放,若用户不释放的话,当内存达到一定的特定值时,通过垃圾回收器GC 来回收。

  【值类型和指针总是放在它们被声明的地方,不一定被分配在栈上】

  调用方法:系统先将一段编码(堆的首部地址)放到栈上,紧接着放置方法的参数。然后代码执行到方法时,查找栈中放该堆首部地址所有参数。并通过堆的首部地址来控制堆。

  【引用类型:总是放在堆中】

  当我们使用引用类型时,实际上只是在处理该类型的指针,而引用类型本身。使用值类型的话,则是使用其本身

 //Code1:
public in AddTest(int value){
int result;
result=value+;
return result;
}

C#高级编程笔记 Day 2, 2016年8月 31日 构造函数


//Code2:
public class MyTest{
public int value;
}
public MyTest AddTest(int key){
MyInt result =new MyInt();
result.value=key+;
return result;
}C#高级编程笔记 Day 2, 2016年8月 31日 构造函数

  C#程序在 CLR 上运行时,内存从逻辑上划分两大块 栈和堆。

  Ⅲ、栈和堆的区别。

    ①、栈通常保存着我们代码执行的步骤,比如在 Code 1 中的 AddTest() 方法。  int value ,int result 变量等。

      堆上存放的多是对象和数据。

    ②、栈内存无需我们管理,也不受GC 管理。当栈顶元素使用完毕,立马释放。

      堆则需要GC 清理。

  当程序执行的时候,在堆和栈中分配的主要有以下四种类型,

  1、值类型 。2、引用类型。 3、指针 。4、指令。

7、弱引用 :弱引用允许创建和使用对象,但是垃圾回收器运行时,就会回收对象并释放内存。

  WeakReference 类。

  例: WeakReference mathReference =new WeakReference(new MathTest());

8、部分类:partial 关键字允许把类、结构、方法 或接口放在多个文件中。

9、继承:实现继承和接口继承。

    不支持多重实现继承 允许多重接口继承

C#中的类可以派生自另一个类和任意多个接口。


10、【结构和类的区别】

  ①、结构总是派生自 System.ValueType,他们还可以派生自任意多个接口。

  ②、类总是派生自System.Object 或用户选择的另一个类,他们还可以派生自任意多个接口。

实现继承的语法

    class MyTestClass :MyTest{

      //....

    }

C#高级编程笔记 Day 2, 2016年8月 31日 构造函数的更多相关文章

  1. 2016年12月31日 星期六 --出埃及记 Exodus 21:26

    2016年12月31日 星期六 --出埃及记 Exodus 21:26 "If a man hits a manservant or maidservant in the eye and d ...

  2. 2016年10月31日 星期一 --出埃及记 Exodus 19:16

    2016年10月31日 星期一 --出埃及记 Exodus 19:16 On the morning of the third day there was thunder and lightning, ...

  3. 2016年12月31日 学习java 第一天

    6个月没写代码了 现在从头开是学 又遇到了很基础的问题 以前配环境变量的时候  配过classpath  其实不要配classpath  因为运行的时候会优先去classpath去找 class文件  ...

  4. Java日志——2016年5月31日

    1. 三元运算符(A?B:C)属于运算符,表达式必须具有返回值,则A必须是boolean类型值,B和C必须是一个具有返回值的表达式. 2. switch...case本质上只支持int类型的选择判断, ...

  5. 2016年10月31日--网页 Windows对象操作

    Window.opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null. Window.open(URL,name,features,replace):open ...

  6. 2016年3月31日_应化所群体Review

    Review目的: Phonegap的ble插件可以接收到设备发送的信息,但接收并在控制台显示的数据夏一鸣不知道是正确的数据,还是由于编码解码问题导致的乱码问题.此次Review要解决的问题即判断接收 ...

  7. Android高级编程笔记(四)深入探讨Activity(转)

    在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...

  8. 我的Python成长之路---第八天---Python基础(24)---2016年3月5日(晴)

    多线程编程 什么是多线程,线程是操作系统能够进行运算调度的最小单位.他包含在进程之中,是进程中的实际运作单位.线程是进程中一个单顺序的空值六,一个进程可以并发多个线程,每个线程可以并行处理不同的任务. ...

  9. 我的Python成长之路---第七天---Python基础(22)---2016年2月27日(晴)

    socket网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

随机推荐

  1. asp.net mvc4 System.Web.Optimization找不到引用

    在MVC4的开发中,如果创建的项目为空MVC项目,那么在App_Start目录下没有BundleConfig.cs项的内容,在手动添加时在整个库中都找不到:System.Web.Optimizatio ...

  2. ural 1057Amount of Degrees ——数位DP

    link:http://acm.timus.ru/problem.aspx?space=1&num=1057 论文: 浅谈数位类统计问题  刘聪 #include <iostream&g ...

  3. 使用ThinkPHP&plus;Uploadify实现图片上传功能

    首先,将下载的Uploadify压缩包解压放到公共文件夹内.实现代码如下: 前台html部分: <script src="/uploadify/jquery.min.js" ...

  4. LVM 命令集总结(转)

    PV 命令 下面的命令是在与物理卷相关的操作中最常用的命令: lsdev 列出ODM中的设备. chdev 修改设备的特征. mkdev 增加一个设备到系统中. chpv 修改物理卷的状态. lspv ...

  5. orchard相关网址

    1.官网文档  http://docs.orchardproject.net/ 2.github  https://github.com/OrchardCMS/Orchard 3.stackoverf ...

  6. oracle 10G 没有 PIVOT 函数怎么办,自己写一个不久有了

    众所周知,静态SQL的输出结构必须也是静态的.对于经典的行转列问题,如果行数不定导致输出的列数不定,标准的答案就是使用动态SQL, 到11G里面则有XML结果的PIVOT. 但是 oracle 10G ...

  7. &lbrack;java基础&rsqb; java 左移和右移

    今天搜到一个比较好用的在线编译器,希望和大家分享. 除了java还有c++....,地址是http://www.tutorialspoint.com/compile_java_online.php 另 ...

  8. Python&lowbar;sniffer&lpar;网络嗅探器&rpar;

    import socket import threading import time activeDegree=dict() flag=1 def main(): global activeDegre ...

  9. Python常用模块之json模块

    常用模块: 一个Python文件就是一个模块 import xxx 1. 标准模块,Python自带的,如time/random 2. 第三方模块,如连接mysql,需要安装 3. 自己写的Pytho ...

  10. js实现简单拖拽效果

    方法如下: var params = { left: 0, top: 0, currentX: 0, currentY: 0, flag: false }; var getCss = function ...