欢迎光临济南网站建设制作公司-济南申宝网络科技有限公司官网!本公司主营:济南网站制作 济南网站建设 济南天猫淘宝店铺装修 济南软件开发 济南APP开发

济南网站制作公司联系电话 咨询QQ:627816364    24小时服务热线:13964179025

C#中get与set方法的写法详解

相关资讯文章来源:济南申宝网络      发布时间:2017-08-16 00:08:01       文章浏览次数:

释一:
属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一:
get {}
set {}
get 访问器
get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。以下是返回私有字段 name 的值的 get 访问器:

复制代码 代码如下:

private string name;   // the name field
public string Name   // the Name property
{
   get
   {
      return name;
   }
}

当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器读取该属性的值。例如:
Employee e1 = new Employee();
...
Console.Write(e1.Name);   // The get accessor is invoked here
get 访问器必须在 return 或 throw 语句中终止,并且控制不能超出访问器体。
set 访问器
set 访问器与返回 void 的方法类似。它使用称为 value 的隐式参数,此参数的类型是属性的类型。在下例中,set 访问器被添加到 Name 属性:
复制代码 代码如下:

public string Name
{
   get
   {
      return name;
   }
   set
   {
      name = value;
   }
}

当对属性赋值时,用提供新值的参数调用 set 访问器。例如:
e1.Name = "Joe";   // The set accessor is invoked here
在 set 访问器中对局部变量声明使用隐式参数名 (value) 是错误的。
备注
属性按如下方式,根据所使用的访问器进行分类:

只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。
只带有 set 访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。
同时带有 get 和 set 访问器的属性为读写属性。
在属性声明中,get 和 set 访问器都必须在属性体的内部声明。
使用 get 访问器更改对象的状态是一种错误的编程样式。例如,以下访问器在每次访问 number 字段时都产生更改对象状态的副作用。
复制代码 代码如下:

public int Number
{
   get
   {
      return number++;   // Don't do this
   }
}

可以将 get 访问器用于返回字段值,或用于计算字段值并将其返回。例如:
复制代码 代码如下:

public string Name
{
   get
   {
      return name != null ? name : "NA";
   }
}

在上述代码段中,如果不对 Name 属性赋值,它将返回值 NA。
示例 1
此例说明如何访问基类中被派生类中具有同一名称的另一个属性隐藏的属性。
复制代码 代码如下:

// property_hiding.cs
// Property hiding
using System;
public class BaseClass
{
   private string name;
   public string Name
   {
      get
      {
         return name;
      }
      set
      {
         name = value;
      }
   }
}
public class DerivedClass : BaseClass
{
   private string name;
   public new string Name   // Notice the use of the new modifier
   {
      get
      {
         return name;
      }
      set
      {
         name = value;
      }
   }
}
public class MainClass
{
   public static void Main()
   {
      DerivedClass d1 = new DerivedClass();
      d1.Name = "John"; // Derived class property
      Console.WriteLine("Name in the derived class is: {0}",d1.Name);
      ((BaseClass)d1).Name = "Mary"; // Base class property
      Console.WriteLine("Name in the base class is: {0}",
         ((BaseClass)d1).Name);  
   }
}

输出
Name in the derived class is: John
Name in the base class is: Mary

以下是上例中显示的重点:
派生类中的属性 Name 隐藏基类中的属性 Name。在这种情况下,派生类的该属性声明使用 new 修饰符:
   public new string Name
   {
   ...
转换 (BaseClass) 用于访问基类中的隐藏属性:
   ((BaseClass)d1).Name = "Mary";

释二:
代码如下:
复制代码 代码如下:

public class Car
{private string color;
 public string Color
 {
   get
   {return color;
    }
   set
    {color=value;
    }
  }
}

我的理解是:通过GET和SET对公有变量Color进行读写操作,实际就是间接更改color私有变量的值,那既然如此。为何不设color为public,让实例进接对color进行读写操作呢?

如果有一天,老板让你把这个类改成
当汽车的颜色改变时,同时计算一下汽车的《价格》属性
那么如果直接对Color操作,你不是死定了?

“属性”是.net的特色之一。
其实就相当于方法,尤其是java中经常会用到get、set方法(.net的有些思想就是java的)。

属性的真实作用不只是为了更改某个成员变量的值
比如form的size属性在set的同时要重画form,如果你不想让用户对color修改,就不要提供set方法

是面向对象具有的
set and get
它的用途:一般是对类里面的变量进行操作. 而不是直接对类的变量进行操作.
有一个很大的作用就是:便于维护.
因为:
如果一个类的一个变量int a ,在其它包或命名空间类中使用了1000次,但是过了许久,你想把a改为b,
如果直接对变量a操作的话,就得需求修改整个程序的1000处.  如果用属性了,就不会了,只需改这个方法即可
复制代码 代码如下:

public int A
{
 set
 {
   a = value;
 }
 get
 {
   return a;
 }
}
放为:
public int B
{
 set
 {
   b = value;
 }
 get
 {
   return b;
 }
}

除去这个属性之外的地方根本不需要改变
通过上面的讲解。有一点点明白了。
是不是让满足一定条件让GET和SET来改变类中的私有变量。而不能让实例直接操作。像上面的代码保证了color属性的安全性。
既然如此可不可以写成
复制代码 代码如下:

set
{color=value*20;  //value是不是相当于Color的值
}

我当初和你有一样的想法.但是现在改变了。
举个例子说明一下吧.
复制代码 代码如下:

public class Car
{
 public string Color
 {
   get
   {
      if(this.viewstate["color"]!= null)
       {
       return this.viewstate["color"];
       }
       return "":
    }
   set
    {
      this.viewstate["color"];=value;
    }
  }
}

在asp.net中通常这么使用.如果用变量的话就不好使用了。而且get,set中可以写多个语句.如上的get.
不知道这样解释你满意吗?

 在程序中经常碰到get、set,不甚明白,在网上查询时也说的迷迷糊糊,所以整理下,以学的明白透彻点。

    有两个类person:

    public class person

    {

      public string name;

    }

    public class person

    {

      public string Name{set;get;}

    }

    第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类了,而第二个类型的name属性通过get set关键字进行了封装,get和set分别对应的是可读和可写,相当于如下代码:

    private string name;

    public string Name

    {

      get { return name; }

     set { name = value; }

   }

    简单说下区别吧:当实例化第一个“person”这个类时,系统在分配内存空间时对name属性直接分配内存,之后对name属性的操作也是直接操作内存中name属性所在的这个块;而当实例化第二个“人”类型时,系统会先分配一个叫name的private私有的内存空间(此处的name对于类的内部使用,Name对于外部操作使用,要有所区分)之后的读与写的操作都是通过Name这个public的类似于指针的东西来关联name进行,以此达到封装的目的,并且通过get和set关键字也可以控制可读还是可写。建议用后者,封装的好处可以参考相关文档,不再累述了~

    至于get和set的作用,除了控制读写之外还有其他的作用,举个简单的例子,比如说当我给Name赋值的时候想要先进行一些逻辑判断,就可以这样:

        private string name;

        public string Name

        {

            get { return name; }

            set

            {

             name = String.IsNullOrEmpty(value) ? "空" : value;

            }

        }

 

再举例说明下:

    假设类是一银行,既能存钱也能取钱

    Private Money;

    Private class bank()

    {

      get

      {

         return Money;

      }

      Set

      {

         Money=value;

      }

    }

    Money 就像银行里的自动取款机,你看不见里面的Money,但你能用set(存钱),用get(取钱)。Money是一个私有字段,是分装在类中的,类以外的程序不能直接访问的。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;

      }

    }

    可看出,get、set用法中一则是隐藏组件或类内部的真实成员;

    二是用来建立约束的,比如,实现“有我没你”这种约束;

    三是用来响应属性变化事件,当属性变化是做某事,只要写在set方法里就行。

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

实事求是,不自以为是

申宝网络主营:

济南网站制作

济南网站建设

济南网站排名优化

济南软件开发

济南网站制作哪里便宜

济南网也设计哪里好

济南网站制作哪里服务好

济南网店装修

济南做网站公司哪里服务好哪里便宜

版权所有: (济南)申宝网络 备案号:鲁ICP备15045328号
地址:山东省济南市高新区化纤厂路与华龙路交叉口华达宿舍 热线:13964179025Q Q:627816364 微信cbk921