1

我对 C# 编程非常陌生,在 C++ 和 HTML 中具有浅色背景,所以我几乎是从头开始。我一直在看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;
}

列在“人”下。我看不到与“姓名”和“年龄”之间的联系。有人可以突出显示建立连接的代码部分并可能对其进行解释(如果要求不多的话)?非常感谢您提前。

4

3 回答 3

2

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

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

于 2012-09-02T01:53:53.647 回答
1

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

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

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

因此,最后代码的作用与以下相同:

Console.WriteLine("Person details - " + person.ToString());
于 2012-09-02T01:59:58.870 回答
-1

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

我建议不要使用这种{0}方式来格式化你的字符串 - 这是一种非常缓慢的做事方式,它只是在 C# 中安抚那些期望类似于printf(). 执行起来要快得多

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(在生产代码中很常见)很难阅读这种格式。但同样,这是个人喜好。

于 2012-09-02T02:02:51.597 回答