1.构造函数:
构造函数是创建类对象,并且在创建完成前对类进行初始化的特殊函数。
如果定义类时没有声明构造函数,默认会给出一个无参构造函数,
如果定义了任意一个构造函数,将不会提供默认的无参构造函数。
构造方法格式及特点:
方法名必须和类名一致没有返回值类型
构造函数可以重载,public Person(){}
public Person(int age){}
public Person(String name,int age){this.Name=name;this.Age=age;}
用构造函数初始化和new之后通过属性初始化的区别:
语义,有的对象生来就要有一些成员变量被赋值的,否则就是怪胎。
有些属性是出生时设置的,不能后期set改通过ILSpy反编译可看出,其实是编译器“语法糖”,所以和构造函数不一样,赋值是在对象构造之后
属性赋值简化写法
class Person
{
public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public Person(){}public Person(int id){
this.Id = id;
}
2.静态 static}
Person p = new Person() { Id=5,Name="abc"};
Person p1 = new Person(5) { Name = "aaa", Age = 6 };
//等价于Person p = new Person(5); p.Id=6; p.Name="abc"; 初始化是5 然后再赋值为6
Person p2 = new Person { Id=5,Name="a"};
//如果后面有{}的话,如果调用无参构造函数,则可以不写() 不推荐这样做 “语法糖”
一些场景下会要求一个类的多个实例共享一个成员变量;有时候想定义一些不和具体对象关联、不需要new就调用的方法
举例:Console类的WriteLine,MessageBox的Show
static变量不需要new就可以直接通过类名调用。static变量是共享的内存空间,非static变量则是对象隔离的。
static 方法中无法使用this关键字,因为static独立于对象存在,不是任何人的唯一。
//static方法不和任何对象相关
//this.指的是“当前对象的**字段”
static成员中只能访问static成员,不能直接访问非static成员。非static成员可以访问static成员。3.单例模式(singleton)
有的类在系统中只能有一个对象(*,资源管理器、缓存管理器等),这时就要使用“单例模式”(singleton)。
实现单例模式有很多方法,先介绍最简单、最实用的“饿汉式”。
单例模式的实现步骤:
1)构造函数声明为private,这样避免外界访问2)定义一个private readonly static的对象实例,static成员的初始化只在类第一次使用的时候执行一次。readonly修饰变量只能在构造函数或者初始化的时候赋值。3)定义一个public static的getInstance方法,返回唯一实例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SingletonTest1
{
class God{
//静态变量的初始化只执行一次private static God Instance = new God();//pubilc static God Instance1 = new God();字段还是保护起来比较好private God() { }//构造函数声明为private,避免外界调用
public void ZhaoYaoDaDi(){
Console.WriteLine("照耀");
}public static God GetInstance()//定义一个方法: 修饰符 返回值类型 方法名(){ }{return Instance;}
}class Program{
static void Main(string[] args){//God.Instance1.ZhaoYaoDaDi();God.GetInstance().ZhaoYaoDaDi();Console.rReadKey();}
}
}
4.类的静态代码块
class MyTest
{
static MyTest()//只执行一次{
Console.WriteLine("zi 静态代码块");
}public MyTest(){
Console.WriteLine("zi 构造方法");
}
}
MyTest t1 = new MyTest();
MyTest t2 = new MyTest();
静态代码块在类第一次被使用的时候执行一次,在构造函数执行之前执行。
只要用到类,哪怕没new对象(比如只是声明变量)也会被执行,且只执行一次。
静态代码块在类第一次被使用的时候执行一次,在构造函数执行之前执行。且只执行一次。
题目:
public class MyJingTaiDaimaKuai
{
public static int i = test1();//最开始执行 1public int age = test2();//new的时候先执行成员变量的初始化,再执行构造函数 3,7
static MyJingTaiDaimaKuai() 2{
Console.WriteLine("静态代码块");//第二再执行
}
public MyJingTaiDaimaKuai() 5,9
{
Console.WriteLine("构造函数");
}
public static int test1(){
Console.WriteLine("test1");return 3;
}
public static int test2() 4,8{
Console.WriteLine("test2");return 333;
}
}MyJingTaiDaimaKuai a1 = new MyJingTaiDaimaKuai(); 1-5
Console.WriteLine(a1.age); 6
MyJingTaiDaimaKuai a2 = new MyJingTaiDaimaKuai(); 7-9
Console.WriteLine(a2.age); 10
Console.WriteLine(a2.age); 11
输出结果:
teat1静态代码块test2构造函数333test2构造函数333333
当对一个类实例化时
执行顺序:1.静态成员变量初始化(只在第一次new对象时执行一次)
2.静态代码块(只在第一次new对象时执行一次)
3.非静态成员变量初始化(每new一次对象时都会执行一次)
4.执行构造函数(每new一次对象只执行一次)
成员的初始化问题:
一般用于对类进行初始化,以后会用只要一旦开始“接触一个类”,静态成员、static代码块就会被执行
5.命名空间
用文件系统的文件夹解释避免文件名重复的问题。
命名空间语法:
namespace ConsoleApplication1包住类;
当前命名空间中的类无需引用;使用using引用其他命名空间中的类:
还可以直接通过“命名空间+类名”的方式使用“System.Data.SqlClient.SqlConnection”,
不用using,适用于同时使用多个重名的类,比using时候的别名好;
相同名称的类可以在不同命名空间中存在:
调用其他命名空间的类时可 Namespace名.类格式;也可using引用
namespace NameSpaceTest
{
class Program{static void Main(string[] args){Person s1 = new Person();//NameSpaceTest.Person s2 = new NameSpaceTest.Person();NameSpaceTest1.Person s3 = new NameSpaceTest1.Person();Test s4 = new Test();}}
class Person{}
}
namespace NameSpaceTest1
{
class Person{}
}
namespace NameSpaceTest.Test1
{
class Test{}
}