C#-属性与访问器方法?

C#-属性与访问器方法?,c#,inheritance,properties,C#,Inheritance,Properties,据我所知,属性用于提供访问器方法式的功能;然而,他们这样做是以正常的方法继承行为为代价的。与传统的setter/getter方法相比,使用属性有什么优势吗?属性和访问器方法的优缺点是什么?Visual Studio调试器在监视对象时执行getter方法。也就是说,属性访问器是在不可预测的时间执行的,因此不应导致任何明显的副作用。滥用属性可能导致难以解决的错误 使用方法的另一个原因是订单检索可能会被参数化 一个好的做法是,财产访问在计算上是便宜的;不应强制客户端代码将属性值放入局部变量中—这是过早

据我所知,属性用于提供访问器方法式的功能;然而,他们这样做是以正常的方法继承行为为代价的。与传统的setter/getter方法相比,使用属性有什么优势吗?属性和访问器方法的优缺点是什么?

Visual Studio调试器在监视对象时执行getter方法。也就是说,属性访问器是在不可预测的时间执行的,因此不应导致任何明显的副作用。滥用属性可能导致难以解决的错误

使用方法的另一个原因是订单检索可能会被参数化


一个好的做法是,财产访问在计算上是便宜的;不应强制客户端代码将属性值放入局部变量中—这是过早的优化。

Visual Studio调试器在监视对象时执行getter方法。也就是说,属性访问器是在不可预测的时间执行的,因此不应导致任何明显的副作用。滥用属性可能导致难以解决的错误

使用方法的另一个原因是订单检索可能会被参数化


一个好的做法是,财产访问在计算上是便宜的;客户端代码不应该被迫将属性值放入局部变量中,这是过早的优化。

我认为您可能会感到困惑。在您的示例中,应该可以访问上述方法。例如,给定这组类型,以下各项应起作用:

public class Base
{
    public virtual int Datum { get; set; }
}

public class Derived : Base
{
    public override int Datum
    {
        get { return 12; }
        // set method remains as normal, with just the get overriden
    }

    public void SetDatumMethod(int newValue)
    {
        Datum = newValue; // Datum as a property is still accessible
    }
}
派生类仍然继承该属性。在C#(大多数情况下)中,属性实际上只是语法糖,因为编译器在幕后为您生成
set_Datum(intx)
get_Datum()
方法。属性get/set方法仍然可以单独重写,如上所示


使用属性的优点是它们具有额外的语义意义;它们以某种方式“包含”或“表示”数据,而不是生成数据的方法

我想你可能会感到困惑。在您的示例中,应该可以访问上述方法。例如,给定这组类型,以下各项应起作用:

public class Base
{
    public virtual int Datum { get; set; }
}

public class Derived : Base
{
    public override int Datum
    {
        get { return 12; }
        // set method remains as normal, with just the get overriden
    }

    public void SetDatumMethod(int newValue)
    {
        Datum = newValue; // Datum as a property is still accessible
    }
}
派生类仍然继承该属性。在C#(大多数情况下)中,属性实际上只是语法糖,因为编译器在幕后为您生成
set_Datum(intx)
get_Datum()
方法。属性get/set方法仍然可以单独重写,如上所示


使用属性的优点是它们具有额外的语义意义;它们以某种方式“包含”或“表示”数据,而不是生成数据的方法

您的第一个示例编译并运行得很好。您仍然在继承这些成员,只是在派生类中指定要查询
Datum
属性时,需要指定要访问Datum的基类实现(
base.Datum=2
)-尽管我确信不管怎样它都应该工作(当您重写数据并且仍然希望查询基本实现时,您肯定需要使用超类访问器)嗯,出于某种原因,在一个项目下,我得到了一个错误,但将其放在一个新项目中运行良好。我的错误。您的第一个示例编译并运行得很好。您仍然在继承这些成员,只是在派生类中指定要查询
Datum
属性时,需要指定要访问Datum的基类实现(
base.Datum=2
)-尽管我确信不管怎样它都应该工作(当您重写数据并且仍然希望查询基本实现时,您肯定需要使用超类访问器)嗯,出于某种原因,在一个项目下,我得到了一个错误,但将其放在一个新项目中运行良好。我错了,明白了。注意,我的例子你是对的,我删除了它,因为它是无效的。另外,关于属性的“隐藏”呢(我不完全理解它,但我认为你不能像隐藏属性一样隐藏访问器方法)?我记得在尝试将属性作为访问器方法处理时遇到了其他困难,尽管我无法立即记住任何困难。到目前为止,你的回答很有帮助,但如果有更多的信息,我将不胜感激。谢谢,我只是想验证你的回答是对两者的彻底比较,而不是泛化。明白了。注意,我的例子你是对的,我删除了它,因为它是无效的。另外,关于属性的“隐藏”呢(我不完全理解它,但我认为你不能像隐藏属性一样隐藏访问器方法)?我记得在尝试将属性作为访问器方法处理时遇到了其他困难,尽管我无法立即记住任何困难。到目前为止,你的回答很有帮助,但如果有更多的信息,我将不胜感激。谢谢你,我只是想验证你的回答是对两者的彻底比较,而不是泛化。你说的“滥用财产”是什么意思?您能否更具体地说明滥用的构成以及可能产生的bug?此外,什么是“订单检索”,您能否更具体地说明为什么“参数化订单检索”优于使用的任何类型的“订单检索”属性?最后,我不明白你的意思,当你建议让财产访问“计算便宜”。在什么情况下客户端代码会被迫将属性值放入局部变量?你能提供这些场景的例子吗?你说的“滥用财产”是什么意思?您能否更具体地说明滥用的构成以及可能产生的bug?此外,什么是“订单检索”,您能否更具体地说明为什么“参数化订单检索”优于使用的任何类型的“订单检索”属性?最后,我不明白当你