📜  C#|物业限制

📅  最后修改于: 2021-05-30 00:58:15             🧑  作者: Mango

先决条件:C#中的属性

属性是类成员的特殊类型,它提供了一种灵活的机制来读取,写入或计算私有字段的值。可以将属性当作公共数据成员使用,但实际上它们是称为访问器的特殊方法。这样可以轻松访问数据,并有助于提高方法的灵活性和安全性。信息的封装和隐藏也可以使用属性来实现。它使用预定义的方法,这些方法是“ get”和“ set”方法,有助于访问和修改属性。

句法:

  
{
        get { // body }
        set { // body }
}

属性限制:编写属性时,我们必须遵循一些规则或限制,如下所示:

  • 属性不能通过ref或out参数传递给方法:属性不能通过out或ref传递,因为属性实际上是方法在编译时,refout都不被视为方法签名的一部分。因此,它将给出编译时错误。除了从程序中完全删除ref或out之外,没有其他解决方案。
  • 您不能重载属性:属性不能重载。这意味着一个人只能将一个get和set访问器和mutator分别放在一个类中。下面给出的程序显示了当我们在同一个类中给多个get访问器时会发生什么。
    // C# program to show what happens when
    // we try to overload a property
    using System;
      
    class Myprop {
      
        int _number;
      
        public int Number
        {
            get
            {
                return this._number;
            }
            set
            {
                this._number = value;
            }
            get
            {
      
                // Causes a compile time error
                // which tells get accessor
                return this._number; 
      
            } // has already been called.
        }
    }
      
    // Driver Class
    class GFG {
      
        // Main Method
        static void Main()
        {
            Myprop ex = new Myprop();
      
             // set { }
            ex.Number = 5;
            console.WriteLine("If there are only two properties"+
                          " in class ex we will get the output");
      
            // get { }
            Console.WriteLine(ex.Number); 
        }
    }
    

    编译时错误:

    但是,通过在同一程序中使用不同类中的属性,可以多次使用get和set方法。下面给出了说明这一点的示例。

    // C# program to demonstrate the use
    // of properties in different classes
    using System;
      
    class Myprop {
      
        int _number;
      
        public int Number
        {
            get
            {
                return this._number;
            }
            set
            {
                this._number = value;
            }
        }
    }
      
      
    class Myprops {
      
        int _number;
        public int Number
        {
            get
            {
                return this._number;
            }
            set
            {
                this._number = value;
            }
        }
    }
      
    // Driver Class
    class GFG {
      
        // Main Method
        static void Main()
        {
            Myprop ex = new Myprop();
            Myprops exs = new Myprops();
      
            // Calls set mutator from the Myprops class
            exs.Number = 7; 
      
            // Calls set mutator from the Myprop class
            ex.Number = 5; 
      
            // Gets the get accessor form the Myprop class
            Console.WriteLine("The value set in the class "+
                                 "Myprop is: " + ex.Number); 
      
            // Gets the get accessor form the Myprops class
            Console.WriteLine("The value set in the class"+
                             " Myprops is: " + exs.Number); 
        }
    }
    

    输出:

    The value set in the class Myprop is: 5
    The value set in the class Myprops is: 7
    
  • 调用get访问器时,属性不应更改基础变量的状态:属性的get访问器预设为只读模式,而set命令设置为只写模式。因此,如果我们尝试输入值或在get访问器的范围内进行修改,则会收到警告,告知我们尝试访问的代码不可访问。下面给出的示例说明了这一点。
    // C# program to demonstrate the 
    // above-mentioned restriction
    using System;
      
    class Myprop {
      
        int _number;
        public int Number
        {
            get
            {
                return this._number;
      
                // We get the warning saying that
                // the code is unreachable.
                this._number = 5; 
            }
            set
            {
                this._number = value;
            }
        }
    }
      
    // Driver Class
    class GFG {
      
        static void Main()
        {
            Myprop ex = new Myprop();
      
            // set { }
            ex.Number = 5; 
      
             // get { }
            Console.WriteLine(ex.Number);
        }
    }
    

    警告:

    输出:

    5

    从程序的输出可以看出,代码已成功运行,但由于无法访问而无法使用我们在get访问器中添加的值。这就是为什么在调用get访问器时无需更改基础变量的原因。