了解C#中的{0}以及引用的方式

时间:2012-09-02 01:52:08

标签: c#

我对使用C ++和HTML的轻量级背景的C#编程非常陌生,所以我几乎从头开始。我正在寻找msdn教程,特别是属性教程,到目前为止我只有一部分我不明白。代码中有一部分是这样的:

// 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;
}

列在“人”下。我没有像“姓名”和“年龄”那样看到连接。有人可以突出显示连接的代码部分,并可能解释它,如果没有太多要求?非常感谢你提前。

3 个答案:

答案 0 :(得分:2)

您正在使用.Net的字符串格式化服务(允许您编写{0}的代码。

.Net将在您传递的每个对象上调用ToString()方法将其转换为字符串。 (如果它已经是一个字符串,string.ToString()将自行返回)
由于您覆盖了类中的ToString()方法,因此系统会调用它。

答案 1 :(得分:1)

您正在使用字符串格式。 WriteLine有一个重载,第一个参数是一个格式字符串,所以你做的是:

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

Format方法获取值参数并将它们转换为字符串,然后将它们插入格式字符串中。将任何东西变成字符串的标准方法是调用每个对象都有的ToString方法。如果要指定将其转换为字符串时的内容,请覆盖ToString方法。

所以,最后代码的作用与:

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

答案 2 :(得分:-1)

这不是您问题的严格答案 - 其他人解释了ToString()如何参与下面。我在这里添加它是因为你说你是C#的新手。

我建议不要使用{0}方式来格式化你的字符串 - 这是一种非常缓慢的处理方式,只有在C#才能安抚那些期望与printf()类似的前C程序员。执行

要快得多
Console.WriteLine ( "Age: " + Age.ToString() );

当您使用{0}等时,Format()函数(及其接受此输入样式的变体)首先必须解析输出以检测各种格式选项,然后仍然连接各种格式串起来。

(在我看来,阅读{0}格式样式也要困难得多,因为如果格式字符串中有5-6个输入参数,则很难在参数列表中找到匹配的输入参数。这只是个人偏好,但这里有一个证明这一点的例子:

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

你能发现错误吗?这只有3个参数 - 使用5-6(在生产代码中非常常见),很难阅读这种格式。但同样,这是个人偏好。