`

属性的使用

    博客分类:
  • c#
阅读更多
private string name;

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

用属性Name可以很灵活的使用,读取私有变量name,私有变量是无法访问的,只能通过访问Name来间接的使用name.这样设置变量的作用是,可以在set访问器中设置变量name的限制条件.
public string Name
        {
            get { return name; }
            set {

if(条件)如value.length>=2

name = value;

}
        }

我们这样就可以在set后面添加条件来限制.
访问修饰符
public  
同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员.
private
只有同一类或结构中的代码可以访问该类型或成员。

protected
只有同一类或结构或者派生类中的代码可以访问该类型或成员。

internal
同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。

protected internal
同一程序集中的任何代码或其他程序集中的任何派生类都可以访问该类型或成员。
C# 复制代码
// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return wheels; }
    }
}
protected internal 可访问性的意思是受保护“或”内部,而不是受保护“和”内部。换句话说,可以从同一程序集内的任何类(包括派生类)中访问 protected internal 成员。若要限制为只有同一程序集内的派生类可以访问,请将类本身声明为内部,并将其成员声明为受保护。

get 访问器
get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。例如,当正在从 get 访问器返回私有变量并且启用了优化时,对 get 访问器方法的调用由编译器进行内联,因此不存在方法调用的系统开销。然而,由于在编译时编译器不知道在运行时实际调用哪个方法,因此无法内联虚拟 get 访问器。以下是返回私有字段 name 的值的 get 访问器:

C# 复制代码
class Person
{
    private string name;  // the name field
    public string Name    // the Name property
    {
        get
        {
            return name;
        }
    }
}

当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器以读取该属性的值。例如:

C# 复制代码
Person person = new Person();
//...

System.Console.Write(person.Name);  // the get accessor is invoked here

get 访问器必须以 return 或 throw 语句终止,并且控制权不能离开访问器体。

通过使用 get 访问器更改对象的状态不是一种好的编程风格。例如,以下访问器在每次访问 number 字段时都会产生更改对象状态的副作用。
C# 复制代码
private int number;
public int Number
{
    get
    {
        return number++;   // Don't do this
    }
}

get 访问器可用于返回字段值,或用于计算并返回字段值。例如:

C# 复制代码
class Employee
{
    private string name;
    public string Name
    {
        get
        {
            return name != null ? name : "NA";
        }
    }
}

在上一个代码段中,如果不对 Name 属性赋值,它将返回值 NA。

set 访问器
set 访问器类似于返回类型为 void 的方法。它使用称为 value 的隐式参数,此参数的类型是属性的类型。在下面的示例中,将 set 访问器添加到 Name 属性:

C# 复制代码
class Person
{
    private string name;  // the name field
    public string Name    // the Name property
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}

当对属性赋值时,用提供新值的参数调用 set 访问器。例如:

C# 复制代码
Person person = new Person();
person.Name = "Joe";  // the set accessor is invoked here               

System.Console.Write(person.Name);  // the get accessor is invoked here

在 set 访问器中,对局部变量声明使用隐式参数名称 value 是错误的。

  备注
可将属性标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户如何才能访问属性。同一属性的 get 和 set 访问器可能具有不同的访问修饰符。例如,get 可能是 public 以允许来自类型外的只读访问;set 可能是 private 或 protected。有关更多信息,请参见访问修饰符(C# 编程指南)。

可以使用 static 关键字将属性声明为静态属性。这使得调用方随时可使用该属性,即使不存在类的实例。有关更多信息,请参见静态类和静态类成员(C# 编程指南)。

可以使用 virtual 关键字将属性标记为虚属性。这样,派生类就可以通过使用 override 关键字来重写事件行为。有关这些选项的更多信息,请参见继承(C# 编程指南)。

重写虚属性的属性还可以是 sealed 的,这表示它对派生类不再是虚拟的。最后,可以将属性声明为 abstract。这意味着类中没有任何实现,派生类必须编写自己的实现。有关这些选项的更多信息,请参见 抽象类、密封类及类成员(C# 编程指南)。

说明:
对 static 属性的访问器使用 virtual(C# 参考)、abstract(C# 参考)或 override(C# 参考)修饰符是错误的。


  示例
此例说明了实例、静态和只读属性。它从键盘接受雇员的姓名,按 1 递增 NumberOfEmployees,并显示雇员的姓名和编号。

C# 复制代码
public class Employee
{
    public static int NumberOfEmployees;
    private static int counter;
    private string name;

    // A read-write instance property:
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    // A read-only static property:
    public static int Counter
    {
        get { return counter; }
    }

    // A Constructor:
    public Employee()
    {
        // Calculate the employee's number:
        counter = ++counter + NumberOfEmployees;
    }
}

class TestEmployee
{
    static void Main()
    {
        Employee.NumberOfEmployees = 107;
        Employee e1 = new Employee();
        e1.Name = "Claude Vige";

        System.Console.WriteLine("Employee number: {0}", Employee.Counter);
        System.Console.WriteLine("Employee name: {0}", e1.Name);
    }
}
/* Output:
    Employee number: 108
    Employee name: Claude Vige
*/

此示例说明如何访问基类中由派生类中具有同一名称的另一个属性所隐藏的属性。

C# 复制代码
public class Employee
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

public class Manager : Employee
{
    private string name;

    // Notice the use of the new modifier:
    public new string Name
    {
        get { return name; }
        set { name = value + ", Manager"; }
    }
}

class TestHiding
{
    static void Main()
    {
        Manager m1 = new Manager();

        // Derived class property.
        m1.Name = "John";

        // Base class property.
        ((Employee)m1).Name = "Mary";

        System.Console.WriteLine("Name in the derived class is: {0}", m1.Name);
        System.Console.WriteLine("Name in the base class is: {0}", ((Employee)m1).Name);
    }
}
/* Output:
    Name in the derived class is: John, Manager
    Name in the base class is: Mary
*/

以下是上一个示例中的要点:

派生类中的属性 Name 隐藏基类中的属性 Name。在这种情况下,派生类的属性声明中使用 new 修饰符:

C# 复制代码
public new string Name

转换 (Employee) 用于访问基类中的隐藏属性:

C# 复制代码
((Employee)m1).Name = "Mary";

有关隐藏成员的更多信息,请参见 new 修饰符(C# 参考)。

在此例中,Cube 和 Square 这两个类实现抽象类 Shape,并重写它的抽象 Area 属性。注意属性上 override 修饰符的使用。程序接受输入的边长并计算正方形和立方体的面积。它还接受输入的面积并计算正方形和立方体的相应边长。

C# 复制代码
abstract class Shape
{
    public abstract double Area
    {
        get;
        set;
    }
}

class Square : Shape
{
    public double side;

    public Square(double s)  //constructor
    {
        side = s;
    }

    public override double Area
    {
        get
        {
            return side * side;
        }
        set
        {
            side = System.Math.Sqrt(value);
        }
    }
}

class Cube : Shape
{
    public double side;

    public Cube(double s)
    {
        side = s;
    }

    public override double Area
    {
        get
        {
            return 6 * side * side;
        }
        set
        {
            side = System.Math.Sqrt(value / 6);
        }
    }
}

class TestShapes
{
    static void Main()
    {
        // Input the side:
        System.Console.Write("Enter the side: ");
        double side = double.Parse(System.Console.ReadLine());

        // Compute the areas:
        Square s = new Square(side);
        Cube c = new Cube(side);

        // Display the results:
        System.Console.WriteLine("Area of the square = {0:F2}", s.Area);
        System.Console.WriteLine("Area of the cube = {0:F2}", c.Area);
        System.Console.WriteLine();

        // Input the area:
        System.Console.Write("Enter the area: ");
        double area = double.Parse(System.Console.ReadLine());

        // Compute the sides:
        s.Area = area;
        c.Area = area;

        // Display the results:
        System.Console.WriteLine("Side of the square = {0:F2}", s.side);
        System.Console.WriteLine("Side of the cube = {0:F2}", c.side);
    }
}
/* Example Output:
    Enter the side: 4
    Area of the square = 16.00
    Area of the cube = 96.00

    Enter the area: 24
    Side of the square = 4.90
    Side of the cube = 2.00
*/


摘自http://msdn.microsoft.com/zh-cn/library/w86s7x04.aspx

分享到:
评论

相关推荐

    Python语言中面向对象属性使用方法的探讨.pdf

    Python语言中面向对象属性使用方法的探讨.pdf

    Vue组件中prop属性使用说明实例代码详解

    Vue 组件中 Prop 属性使用说明实例代码详解 Vue 组件中 Prop 属性是一个非常重要的概念,它允许开发者在组件之间传递数据。 Prop 属性可以是静态的,也可以是动态的。静态的 Prop 属性可以直接在模板中传入值,而...

    ViewPager之PageTransformer属性使用Demo

    【标题】"ViewPager之PageTransformer属性使用Demo"深入解析 在Android开发中,ViewPager是一个非常常用的组件,它允许用户通过左右滑动来切换不同的页面。然而,为了提供更丰富的用户体验,我们可以通过自定义...

    VBA的listbox的list属性使用大全.xlsm

    listbox的list属性使用大全.xlsm 使用list方法加载数据,可使用数组加载,可模糊关键字查询 设置窗体+列表框+关键字查询

    (Swift)internal属性使用

    (Swift)internal属性使用

    listview的属性使用大全

    当我们需要改变 ListView 的背景颜色时,可以使用该属性指定背景颜色。例如,我们可以指定背景颜色为白色: ```xml android:cacheColorHint="#FFFFFF" ``` 或者,我们可以使用图片作为背景: ```xml android:...

    4.flutter-betterplayer控制器属性使用

    4.flutter-betterplayer控制器属性使用

    ecshop商品属性使用图片替换功能,支持颜色等任何属性替换成图片

    6. **SEO考虑**:在使用属性图片的同时,别忘了优化SEO,确保商品的基本信息(如标题、描述)包含关键属性词,以便搜索引擎能够正确索引和展示商品。 总之,ECShop的商品属性图片替换功能极大地提升了商品展示的...

    达内php培训:div页面布局中常用的属性使用示例

    达内php培训:div页面布局中常用的属性使用示例 详尽的解说,简单易懂,对于初学者,很有帮助。

    属性使用的一些小例子

    下面我们将深入探讨属性的使用及其重要性。 1. **属性定义与应用** 属性定义使用`[AttributeClass]`的语法,其中`AttributeClass`是自定义的属性类,继承自`System.Attribute`基类。例如,我们可以创建一个名为`...

    css float浮动属性使用方法和实例讲解

    css float是一个经常需要使用的css属性,该属性用于设置css块级元素的浮动方向(左右浮动)。本文向码农介绍css float使用方法和实例应用。 Css的float浮动属性,用于设置标签对象(如:标签盒子、标签、标签、标签...

    LBVIEW 的闪烁属性使用VI

    希望以此共享能帮到LABVIEW的初学者 对闪烁属性的使用有点帮助

    view自定义属性使用and more

    1. declare-styleable 在res/values目录下新建xml文件 自定义你的属性 2. AttributeSet和TypedArray 在view中获取这些属性对应的值,设置绑定... xmlns申明与引用 在你要使用的地方引入命名空间并使用这些属性,赋值

    CATIA二次开发:C#方式获取产品属性:一般属性及自定义属性

    例如,获取自定义属性使用pd.ReferenceProduct.UserRefProperties;设置自定义属性则需要根据属性类型(未知、自制、外购等)来决定设置方法。 CATIA二次开发不仅限于属性信息的读取和设置,还可以包括更加复杂的...

    CSS属性 - white-space 空白属性使用说明

    CSS 属性 - white-space 空白属性使用说明 白白空属性是 CSS 中一个重要的属性,它用于控制 HTML 元素中的空白处理。通过设置 white-space 属性,我们可以控制文本在元素中的换行、空格和制表符等空白符的处理方式...

    一起学习C#小代码:属性的使用.rar

    让我们深入探讨一下C#中的属性使用。 ### 1. 属性的语法 属性的声明通常遵循以下格式: ```csharp [访问修饰符] [属性类型] 属性名 { get { return 字段名; } set { 字段名 = value; } } ``` 这里的访问修饰符...

    免费VB属性大全文挡

    根据提供的标题“免费VB属性大全文挡”及描述与标签,我们可以推断这份文档主要涉及Visual Basic(简称VB)编程语言中的属性使用方法及其详细解释。然而,由于提供的部分内容并没有实质性的信息,我们将依据标题和...

    C#属性的几个经典例子(源代码)C#属性的几个经典例子(源代码)

    总结,C#属性提供了灵活的数据访问机制,通过自动属性、只读属性、计算属性、带有自定义逻辑的访问器、私有访问器、静态属性和异步属性等,我们可以构建强大且安全的数据模型。理解并熟练运用这些知识点,能有效提高...

Global site tag (gtag.js) - Google Analytics