2012-09-02 27 views
1

我對C#和HTML中的輕量級背景的C#編程非常陌生,所以我幾乎從頭開始。我一直在尋找雖然msdn教程,屬性教程specfically,目前只有一部分我不明白。還有就是在代碼中的一部分是這樣的:瞭解C#中的{0}以及如何引用事物

// person.cs 

using System; 

class Person 
{ 

private string myName ="N/A"; 

private int myAge = 0; 

// Declare a Name property of type string: 
public string Name 
{ 
    get 
    { 
     return myName; 
    } 
    set 
    { 
     myName = value; 
    } 
} 

// Declare an Age property of type int: 
public int Age 
{ 
    get 
    { 
     return myAge; 
    } 
    set 
    { 
     myAge = value; 
    } 
} 

public override string ToString() 
{ 
    return "Name = " + Name + ", Age = " + Age; 
} 

public static void Main() 
{ 
    Console.WriteLine("Simple Properties"); 

    // Create a new Person object: 
    Person person = new Person(); 

    // Print out the name and the age associated with the person: 
    Console.WriteLine("Person details - {0}", person); 

    // Set some values on the person object: 
    person.Name = "Joe"; 
    person.Age = 99; 
    Console.WriteLine("Person details - {0}", person); 

    // Increment the Age property: 
    person.Age += 1; 
    Console.WriteLine("Person details - {0}", person); 
} 
} 

和程序的輸出是這樣的:

Simple Properties 
Person details - Name = N/A, Age = 0 
Person details - Name = Joe, Age = 99 
Person details - Name = Joe, Age = 100 

現在我明白了{0}用途不同引用代碼的一部分的佔位符,在這種情況下,它是「人」,但我不明白這部分如何:

public override string ToString() 
{ 
    return "Name = " + Name + ", Age = " + Age; 
} 

被列在「人員」下。我沒有看到像「名字」和「年齡」這樣的連接。難道有人可以突出顯示進行連接的代碼的一部分,並可能解釋它,如果它沒有多少要求?非常感謝你提前。

回答

1

您正在使用字符串格式化該WriteLine有一個重載,其中第一個參數是一個格式字符串,所以你正在做同樣的事情:

Console.WriteLine(String.Format("Person details - {0}", person)); 

Format方法採用值參數,並把它們轉換成字符串,然後將它們插入到格式字符串。將任何東西變成字符串的標準方法是調用每個對象所具有的方法ToString。如果要指定將其轉換爲字符串時的外觀,請覆蓋ToString方法。

那麼,到底代碼是做一樣的:

Console.WriteLine("Person details - " + person.ToString()); 
+0

謝謝,所有其他答案都很好,但這對我來說對於可視化目的最有幫助。 –

2

您正在使用的.Net的字符串格式化服務(即允許你寫{0}代碼。

.NET可以致電每次ToString() Method對象傳遞給它轉換成一個字符串。(如果它已經一個字符串,string.ToString()只返回本身)
既然你推翻你們班ToString()方法,它就會被系統調用。

+0

你確定它不只是在一切上調用ToString(),而且字符串只是返回它自己? ;-) – CodeNaked

+0

@CodeNaked:我想知道,因爲我輸入的答案。 – SLaks

+1

我查過了;你是對的。 – SLaks

-1

這不是嚴格意義上的回答您的問題 - 別人解釋ToString()是如何參與之下。我在這裏添加它是因爲你說你是C#的新手。

我建議不要使用{0}方式格式化你的字符串 - 這是做事情的一個引人注目的緩慢方式,它只是在C#安撫誰想到類似printf()東西前C程序員。它的速度更快當您使用{0}等等,Format()功能(及其變種接受該輸入風格)執行

Console.WriteLine ("Age: " + Age.ToString()); 

首先必須解析輸出來檢測各種格式化選項,然後還串聯了各種串聯在一起。

(在我看來,閱讀{0}格式化樣式也很難,因爲如果在格式字符串中有5-6個輸入參數,很難在字符串後面的參數列表中找到匹配的輸入參數。這僅僅是個人喜好,但這裏有一個例子可以證明這一點):

Console.WriteLine ("Details: 1.Age: {0}\n2.First Name: {1}\n3.Last Name: {2}\n", 
    FirstName, LastName, Age); 

你能找出錯誤?這只是3個參數 - 使用5-6(在生產代碼中非常常見),很難閱讀這種格式。但是,這又是個人偏好。

+0

你爲什麼失望?每一個細節都是正確的。你不必同意它,但它絕對正確。 – xxbbcc

+0

至少與string.Format()你可以傳入一個文化,並通過所有的格式。當然,你還可以使用格式參數來做數字,日期等有趣的事情。當然,你最終不會得到很多很多不可變的字符串,這些字符串在+ +之後加上+之後。 – blowdart

+0

@blowdart是的,你絕對會得到相同數量的不可變字符串。 'Format()'在內部簡單地解析你的輸入字符串,然後簡單地在每個參數上逐一調用'.ToString()'。你提到的所有東西都可以通過一個'ToString()'重載來完成,並且它會更簡單,因爲解析部分不需要完成。 – xxbbcc

相關問題