.Net学习笔记-.Net基础2 C#面向对象基础2 构造函数

来源:互联网 发布:mac flash第三步不显示 编辑:程序博客网 时间:2024/06/06 16:54
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;
}
}
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"};
//如果后面有{}的话,如果调用无参构造函数,则可以不写()   不推荐这样做 “语法糖”
2.静态 static
一些场景下会要求一个类的多个实例共享一个成员变量;有时候想定义一些不和具体对象关联、不需要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();//最开始执行               1
public 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
构造函数
333
test2
构造函数
333
333
当对一个类实例化时
执行顺序: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
{
}
}
阅读全文
0 0
原创粉丝点击