2015-04-04 47 views
0

我對編程非常陌生,所以請原諒我,如果這是一個簡單的修復。對於我的字符串變量「city」,我始終得到一個錯誤「使用未分配的局部變量」。令我困惑的是,我也有一個名爲「centreName」的字符串變量,即使它沒有被初始化也不會引發相同的錯誤。在C#中出現錯誤「使用未分配的局部變量」

這個程序的重點是讓用戶輸入科學中心的名稱和它所在的城市的數據。我嘗試初始化「城市」變量string city = nullstring city = "",但是當我運行程序,輸出顯示爲空白,而不是用戶輸入的內容。我的「centreName」變種不是這種情況。

我將包括我正在使用的兩個類的編碼。請忽略我的方法,因爲我還沒有調整它們以適合此程序。它們是我以前使用的較舊的方法,編碼在此不適用。

這是我遇到了錯誤的類:

class ScienceCentreApp 
{ 
    static void Main(string[] args) 
    { 
     string centreName; 
     string city; 
     decimal ticketPrice = 0; 
     int visitorCnt; 
     string[] dArray = new String[5]; 
     int[] adultVisitors = new int[5]; 
     decimal[] totalRevenue = new decimal[5]; 
     char enterMoreData = 'Y'; 
     ScienceCentreVisitation scv; 


     do 
     { 
      visitorCnt = GetData(out centreName, city, ticketPrice, dArray, adultVisitors, totalRevenue); 
      scv = new ScienceCentreVisitation(centreName, city, ticketPrice, dArray, adultVisitors, totalRevenue); 
      Console.Clear(); 
      Console.WriteLine(scv); 

      Console.Write("\n\n\n\nDo you want to enter more data - " + 
          "(Enter y or n)? "); 
      if (char.TryParse(Console.ReadLine(), out enterMoreData) == false) 
       Console.WriteLine("Invalid data entered - " + 
            "No recorded for your respones"); 
     } while (enterMoreData == 'y' || enterMoreData == 'y'); 

     Console.ReadKey(); 
    } 

    public static int GetData(out string centreName, string city, decimal ticketPrice, string[] dArray, int[] adultVisitors, decimal[] totalRevenue) 
    { 
     int i, 
      loopCnt; 

     Console.Clear(); 
     Console.Write("Name of Centre: "); 
     centreName = Console.ReadLine(); 
     Console.Write("City: "); 
     city = Console.ReadLine(); 
     Console.Write("Ticket Price: "); 
     string inValue = Console.ReadLine(); 
     ticketPrice = Convert.ToDecimal(inValue); 
     Console.Write("How many records for {0}? ", centreName); 
     string inValue1 = Console.ReadLine(); 
     if (int.TryParse(inValue1, out loopCnt) == false) 
      Console.WriteLine("Invalid data entered - " + 
           "0 recorded for number of records"); 
     for (i = 0; i < loopCnt; i++) 
     { 
      Console.Write("\nDate (mm/dd/yyyy): "); 
      dArray[i] = Console.ReadLine(); 
      if (dArray[i] == "") 
      { 
       Console.WriteLine("No date entered - " + 
            "Unknown recorded for visits"); 
       dArray[i] = "Unknown"; 
      } 
      Console.Write("Number of One-Day Adult Visitors: "); 
      inValue1 = Console.ReadLine(); 
      if (int.TryParse(inValue1, out adultVisitors[i]) == false) 
       Console.WriteLine("Invalid data entered - " + 
            "0 recorded for adults visited"); 
     } 
     return i; 
    } 
} 

}

這是其他類,首先是呼籲:

class ScienceCentreVisitation 
{ 
    private string centreName; 
    private string city; 
    private decimal ticketPrice; 
    private string[] visitDate; 
    private int[] adultVisitors; 
    private decimal[] totalRevenue; 


    //constructors 
    public ScienceCentreVisitation() 
    { 

    } 

    public ScienceCentreVisitation(string cent) 
    { 
     centreName = cent; 
    } 

    public ScienceCentreVisitation(string cent, string cit, decimal price, string[] date, int[] visit, decimal[] rev) 
    { 
     visitDate = new string[date.Length]; 
     adultVisitors = new int[visit.Length]; 
     totalRevenue = new decimal[rev.Length]; 
     Array.Copy(date, 0, visitDate, 0, date.Length); 
     Array.Copy(visit, 0, adultVisitors, 0, adultVisitors.Length); 
     Array.Copy(rev, 0, totalRevenue, 0, rev.Length); 
     centreName = cent; 
     city = cit; 
     ticketPrice = price; 
    } 

    //properties 
    public string CentreName 
    { 
     get 
     { 
      return centreName; 
     } 
     set 
     { 
      centreName = value; 
     } 
    } 

    public string City 
    { 
     get 
     { 
      return city; 
     } 
     set 
     { 
      city = value; 
     } 
    } 

    public decimal TicketPrice 
    { 
     get 
     { 
      return ticketPrice; 
     } 
     set 
     { 
      ticketPrice = value; 
     } 
    } 

    public string[] VisitDate 
    { 
     get 
     { 
      return visitDate; 
     } 
     set 
     { 
      visitDate = value; 
     } 
    } 

    public int[] AdultVisitors 
    { 
     get 
     { 
      return adultVisitors; 
     } 
     set 
     { 
      adultVisitors = value; 
     } 
    } 

    public decimal[] TotalRevenue 
    { 
     get 
     { 
      return totalRevenue; 
     } 
     set 
     { 
      totalRevenue = value; 
     } 
    } 

    //methods 
    public decimal CalculateTotalRevenue() 
    { 
     decimal totalRev; 

     int cntOfValidEntries; 
     int total = 0; 
     foreach (int c in adultVisitors) 
      total += c; 
     cntOfValidEntries = TestForZeros(); 
     totalRev = (decimal)total/cntOfValidEntries; 
     return totalRev; 
    } 

    public int TestForZeros() 
    { 
     int numberOfTrueVisits = 0; 
     foreach (int cnt in adultVisitors) 
      if (cnt != 0) 
       numberOfTrueVisits++; 
     return numberOfTrueVisits; 
    } 

    public int GetIndexOfLeastVisited() 
    { 
     int minVisIndex = 0; 

     for (int i = 1; i < adultVisitors.Length; i++) 
      if (adultVisitors[i] > adultVisitors[minVisIndex]) 
       minVisIndex = i; 
     return minVisIndex; 
    } 

    public int GetLeastVisited() 
    { 
     return adultVisitors[GetIndexOfLeastVisited()]; 
    } 

    public string GetDateWithLeastVisited() 
    { 
     return visitDate[GetIndexOfLeastVisited()]; 
    } 

    public int GetIndexOfMostRevenue() 
    { 
     int maxRevIndex = 0; 

     for (int i = 1; i < totalRevenue.Length; i++) 
      if (totalRevenue[i] > totalRevenue[maxRevIndex]) 
       maxRevIndex = i; 
     return maxRevIndex; 
    } 

    public decimal GetMostRevenue() 
    { 
     return totalRevenue[GetIndexOfMostRevenue()]; 
    } 

    public string GetDateWithMostRevenue() 
    { 
     return visitDate[GetIndexOfMostRevenue()]; 
    } 

    public override string ToString() 
    { 
     return "Name of Centre: " + centreName + 
       "\nCity: " + city + 
       "\nDate of Least One-Day Adult Visitors:\t\t" + GetDateWithLeastVisited() + 
       "\nNumber of Least One-Day Adult Visitors: \t\t" + GetLeastVisited() + 
       "\nDate of Most Total Revenue Collected:\t\t" + GetDateWithMostRevenue() + 
       "\nHighest Total Revenue Collected:\t\t" + GetMostRevenue(); 
    } 
} 

}

提前致謝!

+0

它永遠不會被分配一個值 – Plutonix 2015-04-04 15:47:29

+0

局部變量在使用前必須完全初始化。 – chomba 2015-04-04 15:48:18

+0

'centreName'不會引發錯誤,因爲您不是試圖使用它的值,而是將它用作'out'變量。 – Banana 2015-04-04 15:48:38

回答

3

centreNamecity之間的差異是centreName被用作out參數。這意味着你可以用一個未初始化的變量調用該方法,因爲它可以保證該變量在方法內部被分配一個值。

在你的情況下,兩個centreNamecityGetData爲指定的值,這樣你就可以放心地out string city取代string city

+0

非常感謝!你不知道我嘮叨了多久,然後用Google找出了這個問題。 – Feniks 2015-04-04 15:58:53

0

centreName被聲明爲一個out參數(意味着當你離開方法的作用域時,它將保留你在方法內賦給它的最後一個值),所以它被get數據初始化。其餘的變量不會被get數據調用設置,因爲它們不是out參數。

在這一點上,out參數在C#中通常被認爲是不好的做法(我不能說其他語言)。他們大多模糊了方法的用途,並且在方法被調用後(或者錯誤地初始化它)很容易意外地覆蓋了其中一個輸出參數的值。不要使用out參數,而是創建一個包裝數據的對象,並返回該數據而不是int。

+0

我很欣賞這個建議,但這是一份學校作業,而且這是我迄今爲止所學的知識。不過,我會盡量避免在自己的項目上工作。謝謝你的提示。 – Feniks 2015-04-04 15:59:45

+1

只要記住'out'參數確實有它們的位置。在這種情況下,我同意這個答案:返回一個自定義類型可能會更好,但對於另一個例子,我非常喜歡將'T XXX()'與'bool TryXXX(out T result)'配對的模式。例如'int.TryParse','Dictionary.TryGetValue'。 – hvd 2015-04-04 16:02:34

+0

@ hvd我完全同意,當你的失敗行爲必須被處理,但是是預期的,所以不應該拋出異常時,該模式可能非常有用。 – 2015-04-04 16:03:46

相關問題