C# Get/Set 语法使用方法

34

这些是Person类的声明。

protected int ID { get; set; }
protected string Title { get; set; }
protected string Description { get; set; }
protected TimeSpan jobLength { get; set; }

如何使用get/set?在主函数中,我实例化了一个

Person Tom = new Person();

Tom的set/get是怎么用的?

我习惯于使用C++风格,只需编写int getAge()和void setAge()函数即可。但在C#中,有处理get和set的快捷方式吗?


1
如果你将属性声明为受保护的,那么在Person类(和派生类)之外就无法访问它们。 - Thomas Levesque
7个回答

74
假设您可以访问它们(您声明为protected的属性),则可以按如下方式使用它们:
Person tom = new Person();
tom.Title = "A title";
string hisTitle = tom.Title;

这些是属性。它们基本上是带有适当元数据的getter/setter方法对(虽然您可以只有一个getter或setter)。您提供的示例是自动实现属性,其中编译器正在添加后备字段。但是,您也可以自己编写代码。例如,您声明的Title属性如下:

private string title; // Backing field
protected string Title
{
    get { return title; }  // Getter
    set { title = value; } // Setter
}

除了支持字段会被赋予一个"无法言说的名称"(即您无法在C#代码中引用该名称)之外,属性与字段相似。您必须通过属性本身进行访问。

您可以使属性的某一部分比另一部分更受限制。例如,这是非常常见的:

private string foo;
public string Foo
{
    get { return foo; }
    private set { foo = value; }
}

或者作为自动实现属性:

public string Foo { get; private set; }

这里的“getter”是公共的,但“setter”是私有的。


1
@Thomas:根据我们所在的班级不同,会进行编辑。 - Jon Skeet
5
+1表示同意“除了给后备字段一个‘难以言喻的名称’之外”。非常 Lovecraftian(译注:指类似于 Lovecraft 风格的恐怖文学)。 - Dan J
@djacobson:我希望我能想出这个术语,但我认为我最初是从Eric Lippert那里得到的。我不知道他是否想出了它,或者C#团队中的其他人是否想出了它......或者它是否比C#更古老。不过,我同意这是一个可爱的术语。 - Jon Skeet

4
假设你有一个歌曲类(可以参考下面),传统的实现方式如下:
 class Song
  {
       private String author_name;
       public String setauthorname(String X) {}; //implementation goes here
       public String getauthorname() {}; //implementation goes here
  }

现在,考虑这个类的实现。
      class Song 
      {
            private String author_name;
            public String Author_Name
            { 
                 get { return author_name; }
                set { author_name= value; }
             }
      }

在你的“Main”类中,你将编写以下代码:
    class TestSong
    { 
      public static void Main(String[] Args)
      {
          Song _song = new Song(); //create an object for class 'Song'    
          _song.Author_Name = 'John Biley';
          String author = _song.Author_Name;           
          Console.WriteLine("Authorname = {0}"+author);
      }
    }

需要注意的一点:

您设置/获取的方法应该是公共的或受保护的(要小心),但严格来说不应该是私有的。


2

这些是属性。您可以按以下方式使用它们:

Tom.Title = "Accountant";
string desc = Tom.Description;

但考虑到它们被声明为protected,它们的可见性可能是一个问题。


你不能在 Person 类的代码之外访问受保护的属性。 - Nickolodeon
考虑派生类。应该是可能的。;-) - Offler

1

顺便提一下,在C# 3.5中,您可以像这样实例化对象的属性:

Person TOM=new Person 
{ 
   title = "My title", ID = 1 
};

但是,属性必须是公共的。


你是指C# 3还是C# 3.0?有.NET 3.5,但没有C# 3.5。 - Jon Skeet

0

我不明白这是什么意思

属性是成员,提供了一种灵活的机制来读取、写入或计算私有字段的值。属性可以像公共数据成员一样使用,但它们实际上是称为访问器的特殊方法。这使得数据可以轻松访问,同时仍然提供方法的安全性和灵活性。

在这个例子中,类TimePeriod存储一个时间段。在内部,该类以秒为单位存储时间,但提供了一个名为Hours的属性,允许客户端指定以小时为单位的时间。Hours属性的访问器执行小时和秒之间的转换。

示例

class TimePeriod
{
    private double seconds;

    public double Hours
    {
        get { return seconds / 3600; }
        set { seconds = value * 3600; }
    }
}

class Program
{
    static void Main()
    {
        TimePeriod t = new TimePeriod();

        // Assigning the Hours property causes the 'set' accessor to be called.
        t.Hours = 24;

        // Evaluating the Hours property causes the 'get' accessor to be called.
        System.Console.WriteLine("Time in hours: " + t.Hours);
    }
}

属性概述

属性使类能够公开获取和设置值的方式,同时隐藏实现或验证代码。

get 属性访问器用于返回属性值,set 属性访问器用于分配新值。这些访问器可以具有不同的访问级别。

使用 value 关键字来定义由 set 索引器分配的值。

不实现 set 方法的属性是只读的。

http://msdn.microsoft.com/en-US/library/x9fsa0sw%28v=vs.80%29.aspx


0

将它们设置为公共的。也就是说,无论你在哪里使用“protected”这个词,都要改为“public”。如果需要访问控制,在“get”或“set”之前放置它。


0

你无法访问那些被标记为 protected 的属性,这意味着:

只有在同一类或结构中的代码,或派生自该类的类中的代码才能访问该类型或成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接