2015-06-15 21 views
0

難道我(如果有的話如何)做了在.NET語言(更具體VB.NET)以下:.NET使用IIF價值分配給不同的變量

Dim a,b as Integer 
if(somecondition=1,a,b) = 12345 

或者與IIF的任何變種會我沒意見。 基本上我總是分配相同的值,但從來沒有對同一個變量。

+0

你不能使用這樣的結構。你可能會有這樣的單行語句:'如果somecondition = 1然後a = 12345否則b = 12345' – Blackwood

+0

我明顯地簡化了我的問題(例子),但它更復雜並涉及多個條件;加上我的價值不像我的例子那樣是靜態的。因此,我想真實地避免使用多個Ifs .. – jplanglais

+2

如果你的情況更復雜,很難看到你希望如何以這種方式簡化它。也許你應該編輯你的例子來更復雜一點。 – Blackwood

回答

2

你要求做的事情是用一種支持指針類型的語言(如C/C++或C#處於不安全模式)進行解引用; VB.NET不這樣做。你最好利用的是局部變量,參考類型和(或許)ByRef

如果它是一個Class,它的實例化是一個引用類型。 StructureInteger都是值類型。

對於大多數參考類型,您可以設置一個局部變量等於任何感興趣的變量,然後繼續設置其屬性或調用其方法,以確信受影響的實例化是所需的。一個例外是當引用是不可變的類型時,比如String

Dim a, b As New System.Text.StringBuilder() 
    Dim sb As System.Text.StringBuilder = If(somecondition = 1, a, b) 
    sb.Append("OK!") 

其實,一個不一定需要一個局部變量與引用類型。

' Method 2 
    Call If(somecondition = 1, a, b).Append("OK!") 

    ' Method 3 
    With If(somecondition = 1, a, b) 
     .Append("OK!") 
    End With 

對於值類型(以及不可變類),您相當困難。大多數情況下,人們可以做的就是利用局部變量作爲代理,就像Jon Skeet所說的那樣。

的模式我有時用自己:

Dim a, b As Integer 
    If True Then 
     Dim _v As Integer = 12345 
     If somecondition = 1 Then a = _v Else b = _v 
    End If 

注意使用If True Then - 這是如此的_v壽命在End If結束。 「這麼做」是爲了避免:(1)有一長串臨時變量;或(2)考慮到涉及重用臨時變量的常見編碼錯誤的機會。臨時變量名稱(例如「_v」)可以被重用,即使它是一種不同的數據類型,因爲它將是編譯器的一個不同的變量。

+0

接受,謝謝你的詳細解答。 – jplanglais

3

不,我不相信在VB中有這樣做的任何方式。有條件的操作符(例如If(x, y, z))被設計爲基於條件來評估一個表達式或另一個。換句話說,結果是有條件的,而不是它的使用。

只需使用一個正常的If聲明:

If somecondition Then 
    a = 12345 
Else 
    b = 12345 
End If 

或避免重複值(例如,如果它是一個更復雜的表達式):在VB

Dim value As Integer = 12345 
If somecondition Then 
    a = value 
Else 
    b = value 
End If 
+0

查看我對原始帖子的評論 – jplanglais

+3

@jplanglais:這並不能改變你無法做到的事實。您可以預先避免使用局部變量重複該值,但這就是它。 –

0

,而是因爲在C#中的分配返回分配的值,可以在C#中執行以下操作(因爲您提到'任何.NET語言'):

int unused = (someCondition ? a = 123 : b = 123); 
+0

不完全相同 - OP在這裏希望某種乾燥模式。也許更像'*((someCondition == 1)?&a:&b)= 12345'。 – rskar