C# 中的属性的意义

2025-04-13 06:23:48
推荐回答(5个)
回答1:

public int A{ get{return this.a} set{this.a = value} }这种情况还是有意义的,只是你这样写的没意义,比如说,如果需要在get前加一些操作,或者是set的时候进行一些逻辑校验(比如说这个属性对应的是一个数据表的值,如果这个值是超长或者是超大,你需要在赋值前就进行校验,这样就有意义了)

 

单纯在单个类中,public int A {get;set;}与public int A,这样是没啥太多意义的。而属性与变量的区别主要影响在以下几个方面:

  1. 刚才提到的,你可以对属性的读与写进行限定或扩展的操作,但变量不行

  2. 属性是可以override或者是new被继承重载的,但变量不行,并且在继承过程中,属性的访问声明是可以更改的,如父类是public的,子类可以更改为protected等。

  3. 在接口声明中,属性是可以用的,变量不行。

 

像public int A{get;}这种情况,也是一样,在单个类中根本没有任何意义,但有可能这个声明是通过interface过来的,你就只需要声明一下,可以不用,但不能不存在。如果要用到,你就得改其中的代码。

回答2:

属性反应了面向对象的编程思想,即不能直接操作类的字段。属性隔离了字段,而且能对要赋值的字段进行监测,合乎要求的才会被允许。

int _age;
public int Age
{
    get{return _age;}
    set
    {
        if(value>0&&value<150)// 限制用户输入一些稀奇古怪的年龄充数
        {
            _age=value;
        }
    }
}

你提到的第二种写法是自动属性。它必须满足可读可写,否则就会报错。无法编译。

public int A {get;set;}
private int k__BackingField;// 自动生成的

在编译的时候,.NET framework会自动生成一个字段,让属性操作后台生成的字段。如果在构造函数里,或使用实例对象前,没给自动属性赋值,那么调用自动属性就会出错。

回答3:

当为A赋值时内部的b变量也要改变时,用属性这个方法是最好不过的了。

int a;int b;
public int A { get{ return this.a; } set{ this.a = value; this.b = value + 1; } }

当然,public int A也是可以的,只是赋值和取值都只会取本身的值不会去改变其他的东西。

public int A { get; set; }

在net frmaework 2.0里是不支持的。

public int A { get; }

这种编译器都把它看作是ReadOnly了,无法直接赋值,但你可以进行反射或者在构建函数里改目标值:

public class ABC : Form {
    int a = 5; //直接赋值
    public int A { get{ return a; } } //如果没有构建函数,那么会返回默认值5
    public ABC() { //构建函数
        a = 10; //构建函数之后,再调用A会返回a的值10
    }
}

【对于public int A{get;}这种就只能用反射了。】就好像一个类(球),它有个属性Type(类型)是"圆",这时你改成"正方形"就好像不对头尾了吧,本来是"球"的类,还配对"正方形",这时你就需要不让用户修改这个值(ReadOnly),一直保持是"圆"。

回答4:

你的属性只有get方式,没有set方式,所以是只读的。public int D{get;set}才是能读能写的,set特性才可以赋值。
例如有一个类Person,有一个属性字段CardId表示身份证号码,由于每个人的身份证号码都是从一出生就定性的,所以不能改变,于是只能是只读。
那为什么又不用字段public int D;表示呢?那样不是更方便
因为属性是有封装的,例如身份证号码怎么来的呢,假如说是由 省份编号+城市编号+所在地编号+出生年月+随机产生的几位数字。
那就可以这样写get方法了,
get{
return prov_id+city_id+detail_id+birth_day+random();
}

回答5:

公有属性是在任何外部类都可访问到的,如果有人不怀好意就会随意的修改的public字段,很危险的,但是如果改成private,就不能擅自修改,只能通过属性,而在属性里是可以加代码来判断别人付的值是否符合你的要求,不符合的可以直接拒绝赋值,这样就增加了安全性