2015-12-17 92 views
2

我正在處理一個Number結構的自定義實現,其存儲和操作數值的方式非常不同。什麼是爲值類型實現operator ++的正確方法?

的結構是完全不可改變的 - 所有的領域都實現爲readonly

我試圖實現++--運營商,和我碰到的有點慌亂:
你如何進行分配?
或者平臺自動處理,我只需要返回n + 1

public struct Number 
{ 
    // ... 
    // ... readonly fields and properties ... 
    // ... other implementations ... 
    // ... 

    // Empty placeholder + operator, since the actual method of addition is not important. 
    public static Number operator +(Number n, int value) 
    { 
     // Perform addition and return sum 
     // The Number struct is immutable, so this technically returns a new Number value. 
    } 

    // ERROR here: "ref and out are not valid in this context" 
    public static Number operator ++(ref Number n) 
    { 
     // ref seems to be required, 
     // otherwise this assignment doesn't affect the original variable? 
     n = n + 1; 
     return n; 
    } 
} 

編輯:我覺得這不是關於增量和減量運算等問題,重複的,因爲這涉及價值類型的行爲不同於在這種情況下類。我知道類似的規則適用於++--,但我相信這個問題的背景是不同的,並且足夠細緻,獨立。

+0

可能重複[如何在我的類中實現pre和post-increment/decrement運算符?](http://stackoverflow.com/questions/3282619/how-to-implement-pre-and-post-increment-遞減運算符在我的類) –

回答

8

的結構是完全不可改變的 - 所有的字段都爲readonly

好實現!

我試圖實現++--運營商,和我碰到了一點混亂:你是如何進行分配?

你不知道。請記住++運營商的工作。無論是前綴或後綴它:

  • 取操作數
  • 的原始值計算後繼的值
  • 存儲後繼
  • 或者產生原始值或後繼

C#編譯器不知道如何爲您的類型執行的唯一過程是「計算繼承者」,因此這是您的替代操作符應該執行的操作。只要歸還繼承人;讓編譯器處理如何完成這項任務。

或者平臺自動處理,我只需要返回n + 1

是的,那樣做。

0

Number類將具有某種屬性的值。

public static Number operator ++(Number n) 
{ 
    // ref seems to be required, 
    // otherwise this assignment doesn't affect the original variable? 
    n.value = n.value + 1; 
    return n; 
} 

這應該做你想做的。

我寫了這個使用你的結構,並添加了value屬性。

private static void Main(string[] args) 
{ 
    var x = new Number(); 
    x.value = 3; 
    x++; 
    Console.WriteLine(x.value); 
    Console.Read(); 
} 

這正確生成4

+1

您錯過了一個細節,結構是不可變的,所以你不能像這樣分配值字段。 :) – Giffyguy

+0

感謝您指出。 – wentimo

0

num++;本身擴展到num = PlusPlusOperator(num);聲明。由於你的數據類型是不可變的,只有return n+1;和編譯器會處理其餘的。

+1

你的第一句話是不準確的。 'num ++'的返回值是原始值,而不是'PlusPlusOperator(num)'的返回值。懶惰過度簡化(仍然不準確)是聲稱在執行增量之前,'num ++'返回值。請參閱[Eric Lippert的回答](http://stackoverflow.com/a/34342756/18192)以獲取準確答案。 Eric Lippert詳細介紹了[這裏](http://stackoverflow.com/a/3346729/18192)。被警告的是,對這個問題的接受答案是錯誤的。 – Brian

+0

@Brian:不,第一句話是準確的,雖然我明白了爲什麼你認爲它不是。,該句子指出**語句** num ++;是增量運算符結果賦值給原始變量,它是。如果SaxxonPike說**表達式**'num ++'就是這樣,那就錯了。但編譯器完全有權生成聲明表單,就好像它只是一個賦值語句,因爲值 - 變量的原始值 - 將被丟棄。這就是說,我同意這個答案是誤導性的。那半是微妙的。 –

+0

感謝您的反饋。我已經編輯了我的答案,以便更清楚。 「聲明」是我應該使用的詞。 – SaxxonPike

1

++--運營商的處理在C#語言規範中描述,部分7.7.5前綴增量和減量運算:

形式的前綴增量或減量操作的運行時處理+ + x或--x由以下步驟組成:

•如果x被歸類爲一個變量:

   牛進行評估,以產生變量。

    o選中的運算符用x的值作爲參數進行調用。

    o操作員返回的值存儲在x評估給定的位置。

    o操作員返回的值成爲操作的結果。

因此,這些操作符的自定義重載只需要生成遞增/遞減值。其餘部分由編譯器處理。

相關問題