2009-03-02 118 views
24

我今天正在查看Infragistics控件庫的在線幫助,並看到一些使用關鍵字的VB代碼在選項卡控件上設置了多個屬性。自從我完成任何VB編程已經有近10年了,我幾乎忘記了這個關鍵字甚至存在。因爲我對C#還比較陌生,所以我很快去看看它是否有類似的構造。可悲的是,我一直無法找到任何東西。C#中缺少'with'關鍵字

請問C#有一個關鍵字或類似的結構來模仿提供的功能關於VB的關鍵字嗎?如果沒有,爲什麼C#沒有這個技術原因?

編輯:我在詢問我的問題之前搜索了一個現有的條目,但沒有找到一個Ray提到的(here)。爲了完善這個問題,那麼,爲什麼C#沒有這個技術原因呢?並且Gulzar釘了它 - 不,沒有技術原因爲什麼C#沒有關鍵字。這是語言設計師的設計決定。

+0

(題外話,你問protobuf網 - 降我是[email protected]的電子郵件) – 2009-03-27 12:44:37

+0

除了Gulzar Nazim所說的之外,我還在一個會議上向Anders Helsburg問了這個問題。他的回答更加簡潔。 'C#永遠不會支持With關鍵字' – 2013-05-15 19:49:46

回答

22

這是C#項目經理說: Why doesn't C# have a 'with' statement?

  • 小或不存在的可讀性的優點。我們認爲可讀性好處很小或不存在。我不會說,with語句使得代碼不易讀,但有些人可能會這樣做。

  • 語言複雜度增加。添加with語句會使語言更加複雜。例如,VB必須添加新的語言語法來解決局部變量(Text)和「with」目標(.Text)上屬性之間的潛在歧義。解決這個問題的其他方法也會引入語言複雜性。另一種方法是推送作用域並使該屬性隱藏本地變量,但是如果不添加某種轉義語法,則無法引用本地。

  • C++遺產。 C++從來沒有一個with語句,缺乏這樣的語句通常不被C++開發者認爲是一個問題。另外,我們並沒有感覺到其他變化 - 人們正在編寫的代碼類型的變化,平臺中的變化,語言中的其他變化等 - - 更加必要的陳述。

+1

@Gulzar - 感謝您的鏈接。它'抓癢',雖然我不同意Wiltamuth先生的前兩條推理。對於我來說,with關鍵字與可讀性關係不大,因爲它使代碼更易於編寫...... – 2009-03-02 03:35:40

0

不,這是C#dev團隊做出的有意識的決定。人們對'with'關鍵字有不同的看法,因爲如果濫用(嵌套),它會降低代碼的可讀性。

+0

我不知道你可以用「語句」來嵌套。這會降低可讀性。但是,像GoTo和許多其他編程結構一樣,如果使用得當,是否真的很糟糕? – Kibbee 2009-03-02 03:14:00

+1

如果使用得當,我認爲它可以很好。 – 2009-03-02 03:43:39

0

我不認爲它存在技術上的原因。我想說的是,它不存在的原因是它是一種編程結構,僅用於減少打字的目的。有了像智能感知,複製和粘貼之類的東西,世界對這樣的功能再也沒有太多需求。我使用VB.Net,無法回想它是否仍然支持。從來沒有真正感到需要使用它。

13

在C#3.0中,可以使用對象初始創建對象時,達到類似的效果。

var control = new MyControl 
{ 
    Title = "title", 
    SomeEvent += handler, 
    SomeProperty = foo, 
    Another = bar 
}; 

不是:

var control = new MyControl(); 
control.Title = "title"; 
control.SomeEvent += handler; 
control.SomeProperty = foo; 
control.Another = bar; 

需要注意的是,雖然這句法年推出的C#3.0中,你仍然可以用2.0框架使用它,它的編譯器引入只是語法糖。

8

不,「有」關鍵字被故意排除在語言之外。

如果您具有參考的冗長的名字,你可以很容易地使用變量較短提到它,甚至給它一個有限的範圍內:

{ 
    SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece; 
    r.Some = 42; 
    r.Properites = "none"; 
    r.To = 1; 
    r.Set = null; 
} 
10

這不是地道的C#,但如果你真想with等同,你可以這樣做:

Person MyPersonWithALongName = new Person(); 
MyUtils.With(MyPersonWithALongName, p => { 

    p.Name = "George"; 
    p.Address = "123 Main St"; 
    ... 

}); 

class MyUtils { 

    public static void With<T>(T x, Action<T> do) { 
     do(x); 
    } 
} 

更新:
它發生,我認爲你可以讓平凡的轉動我這個更簡潔牛逼成一個擴展方法,或許將其改名「別名」或「作爲」 reabability:

MyPersonWithALongName.Alias(p => { 
    p.Name = "George"; 
    p.Address = "123 Main St"; 
    ... 
}); 
1

這些解決方案:

// .... 
// (class Common) 

public static void With<T>(T property, Action<T> action) { 
    action(property); 
} 

// ... 
// usage somewhere ...  
Person person = GetPerson(); 
Common.With(person, p => { p.Name = "test", p.Age = "123" }); 

這似乎只是我們都走樣了「P」的變量。隨着解決方案的發展,我發現很容易保持變量名稱簡短,這種帶有「With」通用的解決方案不會購買任何優雅。

理想的情況下,我們都會喜歡看語法的一些改造,因此使用類似於多個屬性的初始化今天如何工作的:

Person person = new Person() { Name = "test", Age = "123" };