簡體   English   中英

Visual Basic關鍵字的C#等價物:'With'...'End With'?

[英]C# equivalent for Visual Basic keyword: 'With' … 'End With'?

在Visual Basic中,如果要更改單個對象的多個屬性,則有一個With/End With語句:

Dim myObject as Object

// ' Rather than writing:
myObject.property1 = something
myObject.property2 = something2

// ' You can write:

with myObject
   .property1 = something
   .property2 = something2
   ...
End With

我知道C#可以在創建新對象時執行此操作:

Object myObject = new Object { property1 = something, property2 = something2, ...};

但是如果已經創建了myOject (如Visual Basic正在做的那樣),我該怎么做呢?

你不能在C#中做到這一點。

此功能特定於VB,您可以使用C#最接近的是您描述的對象初始值設定項。

這個怎么樣?

static class Extension
{
    public static void With<T>(this T obj, Action<T> a)
    {
        a(obj);
    }    
}

class Program
{
    class Obj
    {
        public int Prop1 { get; set; }
        public int Prop2 { get; set; }
        public int Prop3 { get; set; }
        public int Prop4 { get; set; }
    }

    static void Main(string[] args)
    {
        var detailedName = new Obj();
        detailedName.With(o => {
            o.Prop1 = 1;
            o.Prop2 = 2;
            o.Prop3 = 3;
            o.Prop4 = 4;
        });
    }
}

如果您試圖避免大量輸入,可以為對象指定一個較短的名稱:

var x = myObject;
x.property1 = something;
x.property2 = something2;

為什么C#沒有VB.NET的'with'運算符?

很多人,包括C#語言設計師,都認為'with'常常會損害可讀性,而且更多的是詛咒而不是祝福。 聲明具有有意義名稱的局部變量並使用該變量對單個對象執行多個操作比使用具有某種隱式上下文的塊更清楚。

@Jon Skeet提供

@Mark Byers答案很好,但變量x將在設置屬性后生效 並且您不能再次使用名稱x (在同一塊中)。

試試這個( 對象必須是此示例中的引用類型 ):

void Main()
{
    var myObject1 = new Foo();
    var myObject2 = new Hoo();

    //elided...

    {
        var _ = myObject1;
        _.MyPropertyA = 2;
        _.MyPropertyB = "3";
    }

    {
        var _ = myObject2;
        _.MyPropertyX = 5;
        _.MyPropertyY = "asd";
    }
}

VB.NET包含一些VB6的設計缺陷,以便向后兼容。 雖然JavaScript有相同的設計缺陷(的確是一個更糟糕的一個,因為它with導致更加模糊結構),其他大部分C-語法語言不這樣做,所以沒有向后兼容性的益處將它添加到C#。

如果“with”表達式是類類型,則“With”語句等效於創建該類型的新臨時變量,初始化為“With”表達式,並在每個前導“。”之前。 用那個變量。 但是,如果它是結構類型,則事情會更復雜。 考慮一下代碼(顯然不是人們通常會寫一些東西的方式,而是按照它來寫一個要點:

With MyPoints(N) ' Array of Point
    N=SomeNewValue
    .X = MyPoints(N).X
    .Y = MyPoints(N).Y
  End With

“With”語句有效地鎖存對MyPoints(N)的引用。 即使將MyPoints更改為其他某個數組,或者更改了N,鎖定的引用仍將指向與執行With語句時相同的數組。 如果一個人聲明了Point類型的局部變量P並抓住MyPoints(N),然后寫入PX和PY,那么寫入只會到達本地副本P,而不是更新數組。 要在C#中實現類似的語義,必須使用局部變量來保存MyPoints和N,或者將With語句的內容放在具有Point類型的ref參數的匿名函數中。 為了避免在運行時創建閉包,匿名函數也應該接受(可能通過引用)從外部作用域需要的任何局部變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM