3 回答

TA貢獻1850條經驗 獲得超11個贊
我認為在這種情況下,如果您使用x.Default = y;或創建一個采用浮點數的構造函數會更好:
// Constructor
public FloatPlugIn(float p)
{
Default = p;
}
用法:
float y = 123;
FloatPlugIn x = new FloatPlugIn(y);

TA貢獻1876條經驗 獲得超5個贊
賦值運算符的語義需要這種行為。實際上:
賦值運算符 (=) 將其右側操作數的值存儲在由其左側操作數表示的存儲位置、屬性或索引器中,并將該值作為其結果返回。操作數必須是相同的類型(或者右側操作數必須隱式轉換為左側操作數的類型)。
隱式轉換運算符的目的不是修改目標值——請注意,可能沒有任何此類目標值,例如在將值傳遞給方法的參數的情況下。
我希望將浮點值添加到現有實例中,而不是完全替換它。
如果您想要一個加法(在您的情況下意味著任何特定的意義),請考慮覆蓋加法+運算符,這反過來又會影響加法賦值+=運算符。但是,FloatPlugIn無論如何您都不會消除新實例的創建。
考慮您在 中有以下方法FloatPlugIn,這將修改現有實例:
public void Add(float f)
{
// do whatever 'addition' means in your case
}
然后+操作員應該像這樣工作:
public static FloatPlugIn operator +(FloatPlugIn a, float b)
{
FloatPlugIn result = a.Clone(); // here Clone() denotes any custom method that creates a copy of that instance
result.Add(b);
return b;
}
在您的代碼中,以下內容將起作用:
FloatPlugIn x = new FloatPlugIn();
x.Minimum = -100;
x.Maximum = 100;
float y = 123;
x += y; // a new instance is created, but the 'addition' logic is preserved
此外,在將值傳遞給方法調用的情況下,同樣可以直觀地工作:
ProcessMyFloatPlugin(x + 123.0f);
您可以看到創建一個新實例作為操作符的結果是一個非常好的主意FloatPlugIn。否則,就地修改x實際上將是一個令人討厭的副作用,任何其他開發人員都完全出乎意料。請注意,如果性能(避免動態內存分配)是一個問題,請考慮使用structs。
- 3 回答
- 0 關注
- 136 瀏覽
添加回答
舉報