[英]What's the standard way of passing objects by reference in C#
我正在為新的必發API用C#語言編寫一個新的投注BOT,並解決了過去的BOT的一些弊端,在這些錯誤中,有很多循環並將值作為參數傳遞給方法,我試圖將所有內容盡可能地拆分。
一種方法可以做某件事,等等。我還想定義一個Bet對象,該對象在我的“投注”工作過程開始時保存我所有的跑步者/競賽/投注信息,並將其傳遞到每個方法(PlaceBet,CancelBet,CheckBetStatus等)中,這些值將被更改。 我想這樣做,所以在過程結束時,我知道單個Bet對象中的所有值都是正確的,因為目前我正在使用很多混合在一起的變量。
因為在我想了解通過引用傳遞對象的標准/最佳/官方/最快方式之前,我在C#中沒有做太多工作來傳遞對象作為引用。
我會做這樣的事情嗎
public struct Bet = {
public long BetID;
public double BetAmount;
public int MarketID;
public string BetStatus;
}
public BetfairBOT(){
Bet bet = new Bet;
// get info from DB
bet.BetID = 10002323;
bet.BetAmount = 10.00;
bet.MarketID=12342;
bet.BetStatus="";
// get current bet status;
this.GetBetStatus(ref bet);
// if not matched place bet
if(bet.BetStatus != "M"){
this.PlaceBet(ref bet);
}
// save to DB
this.SaveBet(ref bet);
}
private void GetBetStatus(ref Bet bet){
// do some stuff
bet.BetStatus = "U";
return;
}
還是我應該使用Bet對象作為方法的返回類型,並在每次返回它,例如
// get current bet status; Setting the bet object to the return object which is passed in by reference
bet = this.GetBetStatus(ref bet);
private Bet GetBetStatus(ref Bet bet){
// do some stuff
bet.BetStatus = "U";
// return my changed object
return bet;
}
還是我應該以其他方式來做?
還應該使用“ out”參數代替“ ref”嗎?
我只想知道通過引用傳遞對象並返回它們的“公認的”“最佳實踐”方法,這樣一來我就不會丟失任何數據。
順便說一句,還有沒有更好的方法可以在此編輯器中格式化代碼? 我嘗試縮進一些結尾的括號,但是它們只是不想成為它們上方的代碼塊的一部分。
有沒有我可以使用的[code]標簽?
感謝您的任何幫助。
搶
除非您確實需要(並且知道您在做什么),否則不要使用struct
。 盡可能使用es class
。 您的生活會更輕松,並且在大多數時間會“自動”工作。
不要使用結構,將類用作您的下注對象。 結構是值類型,因此應該是不可變的,但是您正在傳遞它並更改內部值。
對於您希望完成的工作,您不必“通過引用”。 對象已經通過引用進行了排序。 請記住,對象已經是引用類型。 創建對象時,該對象位於內存中的某個位置,並且變量保存該對象的內存地址。 當您將其傳遞給方法時,內存地址確實會復制到新變量中,因為C#是按值傳遞,但是該變量指向同一對象。
您實際上並沒有傳遞對象,而只是傳遞了對該對象的引用。
您遇到此問題是因為您將Bet
定義為struct
。 如果要使用主鍵將賭注存儲在數據庫中,則通常應改為一個類。 (ValueObject與實體)
一旦上完課,您就不必再進行所有“ by ref”傳遞了。 檢查此問題以獲取何時使用結構。 我的經驗法則:除非有充分的理由,否則不要使用結構。
與您的問題並沒有真正的聯系,但:
避免使用魔術字符串 : bet.BetStatus = "U";
。 您可以使用常量,也可以使用(更好的) enum
來擺脫魔術字符串。 或者,您可以將枚舉'Bet.HasEnded()
私有,並使用類似於Bet.Status == 'E'
方法'Bet.HasEnded()
。
打開/關閉原理 : // get info from DB
。 通過將Bet傳遞給構造函數或使用工廠,可能會得到更好的設計。 使用當前代碼,您將BetfairBOT
與數據庫綁定,這將使自動測試更加困難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.