當我做一類以下內容:使用get和set時,我可以訪問C#中的變量嗎?
public string ModifiedBy { get; set; }
如何C#存儲中的數據。編譯器是否生成一個支持變量,它是如何命名的,並且我可以在不使用get的情況下訪問它;組?
當我做一類以下內容:使用get和set時,我可以訪問C#中的變量嗎?
public string ModifiedBy { get; set; }
如何C#存儲中的數據。編譯器是否生成一個支持變量,它是如何命名的,並且我可以在不使用get的情況下訪問它;組?
您沒有訪問它沒有反映,但如果你 - 這是你如何做到這一點:
using System.Diagnostics;
using System.Linq;
using System.Reflection;
class Program
{
internal class MyClass
{
public string MyProperty { get; set; }
}
static void Main(string[] args)
{
foreach (var mi in
typeof(MyClass).GetMembers(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(m => m is FieldInfo))
{
Debug.WriteLine(mi.Name);
}
MyClass o = new MyClass();
var fi = (FieldInfo)typeof(MyClass).GetMember(
"<MyProperty>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic)[0];
fi.SetValue(o, "Success");
Debug.WriteLine(o.MyProperty);
}
}
這給出了以下的輸出:
<MyProperty>k__BackingField
Success
該語法適用於auto-implemented property。 支持變量由編譯器生成,並且您無權訪問它。
這基本上是編譯成類似:
private string __foo_1; // Compiler-generated - cannot access.
public string ModifiedBy
{
get { return __foo_1; }
set { __foo_1 = value; }
}
你可以通過反射來訪問它 –
@parapurarajkumar:理論上你可以,但對於大多數程序來說,沒有什麼好的結果。 – BrokenGlass
當然。但是你爲什麼要這麼做呢,你可以自己添加支持變量,並避免反射的緩慢?我的推測是OP沒有完全理解C#中的屬性是如何工作的。 –
它存儲在被編譯器生成的私人支持字段。該字段的名稱類似<ModifiedBy>k__BackingField
,雖然可以通過反射來找到它,但不一定是一個好主意。
如果您有訪問該字段的特定原因,則應該將該屬性更改爲使用具有定義的後臺字段的顯式實現。但是,由於根據定義,自動屬性除了保存和檢索該值之外什麼都不做,因此如果您尚未使用更復雜的getter和setter,則我認爲沒有理由需要訪問該字段。
變量的實際名稱是_ModifiedBy。 – Ryan
@minitech:該字段的實際名稱是'
沒錯,但是你不能只是試着在某處使用_ModifiedBy,並期望它能夠工作。這就是我爲什麼離開它的原因。 –
是的,編譯器生成一個後臺字段。
不,你不能在編譯時訪問它。
是的,你可以在運行時通過反射來訪問它。
不,你不應該。
訪問屬性的支持字段,勿庸置疑,實現與支持字段屬性最簡單的方法:如果你想輕鬆自動實現的屬性的
private int _myInt;
public int MyInt {
get { return _myInt; }
set { _myInt = value; }
}
,但不希望每個人都能夠改變它的價值,它可能是適當的訪問修飾符限制爲一個或它的其它部分,即
public int MyInt { get; private set; } // or protected set etc
你不能。但問題是,爲什麼你會想要這樣做呢?如果是速度問題,則不需要使用屬性。否則,我真的沒有理由可以看到你需要訪問自動實現的屬性的支持變量,因爲它們沒有副作用,所以功能幾乎與普通字段相同。
理論上公共汽車財產就像一個公共變量。正如許多人已經提到的那樣;編譯器將創建所需的私有變量來保存數據。如果您需要訪問底層的專用變量,請輸入硬編碼的變量名稱以避免運行時異常。
在現實然而我們需要創建汽車財產確保未來的發展不會打破,在這個裝配depent應用。
將公共變量更改爲屬性是breaking change。參考鏈接的博客以更好地理解它。
你想達到什麼目的? – BrokenGlass