构造函数
构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员赋初始值,总与new运算符一起使用,在创建对象的语句中,一个类中可能有多个构造函数,可根据参数个数的不同或参数的类型的不同来区分它们,即构造函数的重载。一个类中,如果没有写任何构造函数,那么c#的编译器会自动生成一个默认的无参数构造函数,如果写了构造函数,那么在这个类中就有了两个构造函数,一个默认,一个自己写的,如果自己写了构造函数,之前默认存在的构造函数就不能使用了,如果想用之前默认的构造函数,就需要重新写一个无参的构造函数。
构造函数的特点
1.构造函数的命名必须和类名字完全相同
2.构造函数没有返回值,也不能用void来修饰,这保证了他不仅什么也不用自动返回、
3.构造函数不能被直接调用,在用new运算符创建对象的时候才会被调用;而一般方法是在程序执行的时候被调用。
4.在定义一个类的时候,通常情况下都会显示该类的构造函数,并且在函数中指定初始化的工作也可以省略次默认构造函数是不是带参,而一般方法不会有这个特点。
5.当一个类只定义了私有的构造函数,将无法通过new关键字创建其对象。
默认的构造函数和自己写的构造函数都是实例化对象,初始化数据的,默认的是说所有的类都从祖先object哪里继承了空参的构造方法,涡轮我们写不写,空参构造都存在,而有参构造一般是自己写的,参数自己可以写或者不写,构造函数可以为字段赋值,当字段不能赋值的时候,构造函数解决了这一问题。
我们把new的过程称为实例化对象(创建对象) (所以构造函数构造的要是一个完整的对象)
student zsStu = new student();
个人的理解就是构造函数可以解决多次反复赋值的问题
接下来我们用构造函数给里面的字段赋值
1 public class person 2 { 3 //是类的构造方法 4 public person(string name,char gender,int age) 5 { 6 this._name = name;//指示代词 7 this._gender = gender; 8 this._age = age; 9 10 } 11 //重新写的无参构造函数 12 public person() 13 { 14 } 15 16 //构造函数的重载 17 18 private string _name; 19 public string Name 20 { 21 get { return _name; } 22 //set { _name = value; } 23 24 } 25 private char _gender; 26 public char Gender 27 { 28 get { return _gender; } 29 //set { _gender = value; } 30 } 31 private int _age; 32 public int Age 33 { 34 get { return _age; } 35 //set { _age = value; } 36 } 37 //创建一个方法 38 public void Say() 39 { 40 Console.WriteLine("我叫{0},今年{1}岁了,是{2}生", this.Name, this.Age, this.Gender); 41 } 42 }
我们在类中构造这样一个方法,接下来我们就可以在主函数中调用了
11 <pre name="code" class="csharp"> 12 static void Main(string[] args) 13 { 14 person per = new person("张三",'男',18);//利用构造函数给里面的字段赋值 15 per.Say(); 16 Console.ReadKey(); 17 }
读到这里我自己就开始疑惑get 和 set 两个访问器有什么作用 我查了一些资料(在下面提出封装的概念)
1 private int __Old; 2 public int Old{ 3 get{return __Old;} 4 set{__Old = value;} 5 }
这种方法就是用于输入输出
1 private int __Old; 2 public int Old{ 3 get{return __Old;} 4 set{// 这里加入了验证代码 5 if(value<0) 6 throw new ArgumentOutException("value", "输入值不能小于0"); 7 __Old = value; 8 }
但如果这样写的话就加入了一个验证的机制(属性中可以添加些代码进行处理. 也可以设置的访问的权限等)
在类中定义一个属性
1 public class Student 2 { 3 private string name 4 public string Name 5 { 6 set{name=value;}//这里是给私有属性name赋值 7 get{return name;}//这里取出私有属性name的值 8 } 9 }
c#在定义类时,通常要把类中声明的对象封装起来,使得外界不能访问这个属性。上述代码中如果去掉set部分,则外界只能读取name的值,如果去掉get部分,则只能给name赋值。这样就可以控制外界对私有属性name的访问权限了,这种写法是C#的一个特性。
简单的是就是更加方便了属性的取值和赋值
属性与普通变量不同就在于, 普通变量就是放在屋子里的东西, 是什么样明明白白. 而属性则是在屋子的门口放了个守门人, 你拿东西放东西要经过他.
原文转自(https://www.cnblogs.com/qingxinblog/articles/4843373.html)
get 和set规定了我们数据怎么拿怎么放
对GET 和SET 可以单独设置访问权限 比如你对某个成员数据只能读取或者只写,或者只有派生类可以访问等。。。 相对以前来说,没有属性访问器,需要通过函数来调用私有成员数据,属性提供了高效的访问模式和简单的书写。
就是为了安全啊~~
字段是你具体要操作的数据所以他的值不能出错,可是你又不能避免用户犯错~~
补充:
get 和 set 会在相应的时候自动调用
主要是为了隐藏程序内的数据结构时用
get是获取该属性的值,
set设置该属性的值。
在用set时有一个特殊的变量value
就是设置属性时的值
value 隐式参数,用于设置访问器以及添加或移除事件处理程序。
对类的属性进行 设置
比如用类名.属性=“”赋值 set作用
变量=类名.属性 取值 get 作用
如果有错误或者不对的地方欢迎留言评论指点,交流好相互进步
学无止境,希望自己继续前行,加油。