C#get和set方法与手动编写的GetSomeValue()和SetSomeValue(value)方法之间的区别?

C#get和set方法与手动编写的GetSomeValue()和SetSomeValue(value)方法之间的区别?,c#,methods,private,C#,Methods,Private,我想知道通过自动set和getproperties访问C#中的private属性与手动编写的GetSomeValue()方法之间是否有区别 例如: private int someValue{get;set;}; Vs public int GetSomeValue() { 返回一些值; } 这真的没有什么区别。属性语法在很大程度上只是编写专用getter/setter方法的快捷方式。当使用属性时,编译器将创建一个Get和Set方法以及一个私有备份字段 当查看中间语言时,您将看到生成的代码基本

我想知道通过自动
set
get
properties访问C#中的
private
属性与手动编写的
GetSomeValue()
方法之间是否有区别

例如:

private int someValue{get;set;};
Vs

public int GetSomeValue()
{
返回一些值;
}

这真的没有什么区别。属性语法在很大程度上只是编写专用getter/setter方法的快捷方式。当使用属性时,编译器将创建一个Get和Set方法以及一个私有备份字段

当查看中间语言时,您将看到生成的代码基本相同,减去一些标记编译器生成代码的属性和奇怪的编译器生成命名约定。在这两种情况下,私有字段都由getter/setter函数访问

以这两种不同的实现为例:

//method 1
public int Property {get; set;}

//method 2
int property;
public int GetProperty() { return property;}
public void SetProperty(int value) { property = value; }
在IL中,您将看到方法1 getter的以下内容:

//compiler generated backing field
.field private int32 '<Property>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
    01 00 00 00
)

//compiler generated getter method
.method public hidebysig specialname 
    instance int32 get_Property () cil managed 
{
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
        01 00 00 00
    )
    // Method begins at RVA 0x2050
    // Code size 7 (0x7)
    .maxstack 8

    IL_0000: ldarg.0
    //retrieves a backing field
    IL_0001: ldfld int32 Test1.Program::'<Property>k__BackingField' 
    IL_0006: ret
} // end of method Program::get_Property

//your property
.property instance int32 Property()
{
    .get instance int32 Test1.Program::get_Property()
    .set instance void Test1.Program::set_Property(int32)
}

是的,有:语法。顺便说一句,
someValue
不是私有属性,它是私有字段。假设您的意思是
print int someValue{get;set;}
?如果是这样,则不需要。如果您在get/set中做了任何额外的操作,那么这就是区别。属性和方法都可以是虚拟的,并在接口中声明。实际上,每个属性都在IL中编译为get和set方法。但是,
getComeValue()
方法可以作为一个或多个具有不同参数集(或具有默认参数)的方法重写,而属性不能。在源代码中用方法替换所有属性(对于C#world来说)“我想知道”很少是一个足够好的理由,但最糟糕的是你没有做任何类型的操作。
.field private int32 'property'

.method public hidebysig 
    instance int32 GetProperty () cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 7 (0x7)
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: ldfld int32 Test1.Program::'property'
    IL_0006: ret
} // end of method Program::GetProperty