C# Get和Set

  C# get set函数很常用,但是用好还是需要很多经验的,下面的文章就是帮你积累C# get set函数经验的。

  C# get set不提倡将域的保护级别设为 public而使用户在类外任意操作--那样太不OO,或者具体点说太不安全!对所有有必要在类外可见的域,C#推荐采用属性来表达。属性不表示存储位置,这是属性和域的根本性的区别。下面是一个典型的属性设计:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class Default8 : System.Web.UI.Page

{

    class MyClass

    {

        int integer;

        public int Integer

        {

            get

            {

                return integer;

            }

            set

            {

                integer = value;

            }

        }

    }

    protected void Page_Load(object sender, EventArgs e)

    {

        MyClass test = new MyClass();

        Label1.Text = test.Integer.ToString();

        test.Integer++;

        Label2.Text = test.Integer.ToString();

    }

}

  一如我们期待的那样,程序输出0 1。我们可以看到属性通过对方法的包装向程序员提供了一个友好的域成员的存取界面。这里的value是C# get set的关键字,是我们进行属性操作时的set的隐含参数,也就是我们在执行属性写操作时的右值。值得注意的是三种属性(只读,只写,读写)被C# get set认为是同一个属性名,看下面的例子:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class Default8 : System.Web.UI.Page

{

    class MyClass

    {

        protected int num = 0; public int Num { set { num = value; } }

    }

    class MyClassDerived : MyClass

    {

        new public int Num { get { return num; } }

    }

    protected void Page_Load(object sender, EventArgs e)

    {

        MyClassDerived test = new MyClassDerived();

        Label1.Text = test.Num.ToString();

        //test.Integer++;

        //Label2.Text = ((MyClass)test).Num.ToString(); 没有get访问失败

    }

}

   由于属性的方法的本质,属性当然也有方法的种种修饰。属性也有5种存取修饰符,但属性的存取修饰往往为public,否则我们也就失去了属性作为类的公共接口的意义。除了方法的多参数带来的方法重载等特性属性不具备外, virtual, sealed, override, abstract等修饰符对属性与方法同样的行为,但由于属性在本质上被实现为两个方法,它的某些行为需要我们注意。看下面的例子:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class Default8 : System.Web.UI.Page

{

    abstract class A

    {

        int y;

        public virtual int X

        {

            get { return 0; }

        }

        public virtual int Y

        {

            get { return y; }

            set { y = value; }

        }

        public abstract int Z

        {

            get;

            set;

        }

    }

    class B : A

    {

        int z;

        public override int X

        {

            get { return base.X + 1; }

        }

        public override int Y

        {

            set { base.Y = value < 0 ? 0 : value; }

        }

        public override int Z

        {

            get { return z; }

            set { z = value; }

        }

    }

    protected void Page_Load(object sender, EventArgs e)

    {

        B b = new B();

        //b.X = 1;

        Label1.Text = b.X.ToString();

        b.Y = 1;

        b.Z = 10;

        Label2.Text = b.Z.ToString();

    }

}

   这个例子集中地展示了属性在继承上下文中的某些典型行为。这里,类A由于抽象属性Z的存在而必须声明为abstract。子类B中通过base关键字来引用父类A的属性。类B中可以只通过Y-set便覆盖了类A中的虚属性。

  静态属性和静态方法一样只能存取类的静态域变量。我们也可以像做外部方法那样,声明外部属性。以上就是对C# get set的简单介绍。

 

你可能感兴趣的:(set)