一、get、set 的基本简介   

1、有两个person类如下:

public class person1
{
    public string name;
}


public class person2
{
    public string Name{set;get;}
}

 第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类了。而第二个类型的name属性通过get和set关键字进行了封装,get和set分别对应的是可读和可写。由于其除了可读可写外,没有其它的条件限制操作,所以相当于如下代码:

// 字段:一般为私有的,不对外开放
private string name;

// 属性:一般为公有的,作为外部访问对应字段的一个接口
public string Name
{
    get { return name; } //相当于通过Name来返回name的值
   set { name = value; } //通过Name来设置name的值
}

以上的不同写法的区别:

  • 当实例化第一个“person”这个类时,系统在分配内存空间时对name属性直接分配内存,之后对name属性的操作也是直接操作内存中name属性所在的这个块;
  • 当实例化第二个“人”类型时,系统会先分配一个叫name的private私有的内存空间,之后的读与写的操作都是通过Name这个public的类似于指针的东西来关联name进行,以此达到封装的目的,并且通过get和set关键字也可以控制可读还是可写。建议用后者。

2、  至于get和set的作用,除了控制读写之外还有逻辑、条件判断的作用。例如当我给Name赋值的时候想要先进行一些逻辑判断,就可以这样:

private string name;
public string Name
{
    get { return name; }
    set
    {
     name = String.IsNullOrEmpty(value) ? "空" : value;
    }
}

 3、再举例说明下

class Test
    {
        private int age;
        public int Age
        {
            get { return age; }
            set { if (value < 0 || value > 200)
                {
                    Console.WriteLine("无效的赋值,年龄必须在0——200之间");
                }
                else
                {
                    age = value;
                }
                
            }
        }
    }

 C#中get、set用法中,类的set和get成员是外部程序访问类内部属性的唯一方法,就像你去银行取钱,你不能直接从银行的保险柜里拿钱,而是银行营业人员把钱取出来给你的。 
  属性在调用者看来就像一个普通的变量,但作为类的设计者,你可以利用属性来隐藏你类中的一些字段,使外界只能通过属性来访问你的字段,你可以通过属性来限制外界对你的字段的存取,就利用get、set。如果想让用户随意存取你的字段,那么就实现get、set;如果只想让用户读取字段,就只实现get;若只想让用户写字段就只实现set。同时还可以在set和get中对用户传递的值进行一些验证工作,以确保你的字段将含有正确的值。

private int a;
public int index
{
    get
    { return a; }
    set
    {
     If (value>0)
       a=value;
     else
       a=0;
    }
}

 4、可看出,get、set用法有如下特点:

一则是隐藏组件或类内部的真是成员; 
二是用来建立约束的,比如,实现“有我没你”这种约束; 
三是用来响应属性变化事件,当属性变化是做某事,只要写在set方法里就行;

  当你想读出或写入属性的值时,存取标志限定了被实现的语句。用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set。

二、最新简化使用方法

对于只是限定读取和访问权限,而无复杂逻辑条件判断的,可以使用一些简化的方式。

1、原始写法

// 写法一
    class Test
    {
        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
    }


// 写法二
    class Test
    {
        private int age;
        public int Age
        {
            get => age;
            set => age = value;
        }
    }

2、简化写法

一般推荐直接使用简化的写法

    class Test
    {
        public int Age
        { get; set; }

        //或者直接省略
        public int Name;
    }

 


参考资料:

[1]  set(C# 参考)

[2]  自动实现的属性(C# 编程指南)

[3]  属性(C# 编程指南)

[4]  C#属性、字段和成员变量的关系区别

[5]  C# 变量 、字段、属性、方法的区别

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐