簡體   English   中英

在C#中通過引用傳遞對象的標准方法是什么

[英]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 您的生活會更輕松,並且在大多數時間會“自動”工作。

  1. 不要使用結構,將類用作您的下注對象。 結構是值類型,因此應該是不可變的,但是您正在傳遞它並更改內部值。

  2. 對於您希望完成的工作,您不必“通過引用”。 對象已經通過引用進行了排序。 請記住,對象已經是引用類型。 創建對象時,該對象位於內存中的某個位置,並且變量保存該對象的內存地址。 當您將其傳遞給方法時,內存地址確實會復制到新變量中,因為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.

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