为什么写项目到控制台只写命名空间和类名而不是数据?
对于你们大多数人(熟练的程序员)而言,标题听起来可能并不是很好,但我正在学习C#基础知识的第3周,而且我无法弄清楚如何解决下一个任务。 我将为一堆城市存储一些温度,首先向用户询问cityName,然后询问该城市的实际温度。 所有这些东西都应保存在列表中,我将使用Class和Constructor。 当我尝试打印出结果(使用foreach)时,它打印出我的命名空间的名称和我的类的名称,如“Task_5.City”我的代码错误:
public class City //class { public string CityName { get; set; } public int Temperature { get; set; } public City(string name, int temp)//konstruktor { this.CityName = name; this.Temperature = temp; } } class Program { static void Main(string[] args) { var cityList = new List(); Console.WriteLine("What is your city?"); string cityName = Console.ReadLine(); Console.WriteLine("What temperature for this city?"); int temp = Convert.ToInt32(Console.ReadLine()); City myCity = new City(cityName, temp); cityList.Add(myCity); foreach (var item in cityList) { Console.WriteLine(item); } Console.ReadLine(); } }
您正在将对象传递给Console.WriteLine(item)
而不是传递字符串。 Console.WriteLine
调用该对象的ToString()
方法,该方法默认返回名称空间+类名。 您可以像下一样覆盖此行为:
public class City //class { public string CityName { get; set; } public int Temperature { get; set; } public City(string name, int temp)//konstruktor { this.CityName = name; this.Temperature = temp; } public override string ToString() { return string.Format("{0} {1}", CityName, Temperature); } }
或者您可以使用WriteLine
方法的另一个重载:
Console.WriteLine("{0} {1}", item.CityName, item.Temperature);
更改Console.WriteLine(item);
如果您只想写出City
对象的内容,请选择以下选项之一。
Console.WriteLine("City: " + item.CityName + " has a temperature of " + item.Temperature + " degrees.");
或者,如果您愿意,可以使用string.Format
:
Console.WriteLine(string.Format("City: {0} has a temperature of {1} degrees.", item.CityName, item.Temperature));
cityList中的项目是City类型,这意味着您具有CityName和Temperature的属性。
你应该使用:
Console.WriteLine(item.CityName + " is at " + item.Temperature + ".");
或类似的东西。
你正在使用WriteLine
这个重载:
public static void WriteLine(object value)
并且这个重载调用ToString
方法的参数来产生它的字符串表示。 如前所述, ToString
的默认实现返回类型的完全限定名称。
您可以在City
类中覆盖ToString
,以便能够使用此类型的实例,其中需要一个字符串,如Console.WriteLine
public override string ToString() { return CityName + Temperature.ToString(); // return $"{CityName} : {Temperature}"; // Or use C# string interpolation }
或者直接生成必需的字符串并将其传递给WriteLine
方法:
Console.WriteLine($"{item.CityName} : {item.Temperature});
在这里,您尝试打印对象本身。 如果您想打印CityName和Temperature,在foreach内部您必须打印该属性。
foreach (var item in cityList) { Console.WriteLine(item.CityName); Console.WriteLine(item.Temperature); }
但在这里,你只有一个城市和温度,并打印它。 在这种情况下,为什么需要列表?