请帮助任何人。这是我在这个网站上的第一个问题。
我是C#的初学者,对C#结构有一点了解。这里我有两个C#结构源代码。
第一个是关于具有两本书记录的结构,例如书名,作者姓名,页面编号和书籍ID。这里,在第17行中,我声明了两种类型的Book来访问结构的成员但没有使用“new”运算符。但是,它成功编译并提供了正确的输出。
源代码1:
using System;
namespace StructureTest
{
struct Book
{
public string name;
public string author;
public int page_no;
public int book_id;
}
class Program
{
static void Main(String[] args)
{
Book Book1, Book2;
Book1.name = "Programming in ANSI C";
Book1.author = "E Balagurusamy";
Book1.page_no = 450;
Book1.book_id = 34567821;
Book2.name = "C Programming";
Book2.author = "Tamim Shahriar Subeen";
Book2.page_no = 280;
Book2.book_id = 34567477;
Console.WriteLine("Book1 Name = {0}", Book1.name);
Console.WriteLine("Book1 Author Name = {0}", Book1.author);
Console.WriteLine("Book1 Total Page No = {0}", Book1.page_no);
Console.WriteLine("Book1 ID = {0}", Book1.book_id);
Console.WriteLine("Book2 Name = {0}", Book2.name);
Console.WriteLine("Book2 Author Name = {0}", Book2.author);
Console.WriteLine("Book2 Total Page No = {0}", Book2.page_no);
Console.WriteLine("Book2 ID = {0}", Book2.book_id);
Console.ReadKey();
}
}
}
但是在第二个代码中,我在该结构中不同地声明了两个函数,并使用它们来获取记录的值并将它们作为输出打印出来。但令人惊讶的是,代码没有编译显示这些错误消息,
prog.cs(39,13):错误CS0165:使用未分配的局部变量`book1'
prog.cs(43,43):错误CS0165:使用未分配的局部变量`book2'
源代码2:
using System;
namespace StructureWithMethods
{
struct StructureMethods
{
public string name;
public string author;
public int page;
public int id;
public void setvalue(string a, string b, int c, int d)
{
name = a;
author = b;
page = c;
id = d;
}
public void printinfo()
{
Console.WriteLine("Name : " + name);
Console.WriteLine("Author : " + author);
Console.WriteLine("Total Page No : " + page);
Console.WriteLine("ID : " + id);
}
}
class Program
{
static void Main(String[] args)
{
StructureMethods book1,book2;
book1.setvalue("Aaj Himur Biye", "Humayun Ahmed", 232, 45771256);
Console.WriteLine("1st Book Record :");
book1.printinfo();
book2.setvalue("Raju O Agunalir Bhoot", "Md. Zafar Iqbal", 198, 45777129);
Console.WriteLine("\n2nd Book Record :");
book2.printinfo();
Console.ReadKey();
}
}
}
但是,不过有一段时间我在声明struct Book的类型时设法使用“new”关键字,然后成功编译并给出了正确的输出。
现在,我的问题是,我是否应该仅在声明方法时在结构中使用“new”?或者在创建对象时是否必须在结构中使用“new”?但我的第一个代码成功编译。
答案 0 :(得分:3)
我应该在结构中使用“new”
以下是MSDN的一些有用信息:
使用new运算符创建struct对象时,会创建它并调用相应的构造函数。与类不同,可以在不使用new运算符的情况下实例化结构。在这种情况下,没有构造函数调用,这使得分配更有效。但是,字段将保持未分配状态,并且在初始化所有字段之前无法使用该对象。
因此,您编译的第一个代码没有错误,因为您已分配了所有字段,然后使用了该对象。
第二个代码失败,因为struct
对象无法使用,因为您尚未使用new运算符或已分配所有字段,因此您无法使用该对象并在其上调用方法。
例如,在下面的代码new
中没有使用运算符,但它起作用,因为所有字段都已初始化:
class Program
{
static void Main(string[] args)
{
A a;
a.X = 1;
a.Print();
Console.Read();
}
}
struct A
{
public int X;
public void Print()
{
Console.WriteLine("A has X: {0}", this.X);
}
}
但是,下面的代码不起作用,因为字段尚未初始化:
class Program
{
static void Main(string[] args)
{
A a;
//a.X = 1; <------ SEE this is commented out
a.Print();
Console.Read();
}
}
struct A
{
public int X;
public void Print()
{
Console.WriteLine("A has X: {0}", this.X);
}
}
总而言之,你必须:
new
运算符调用构造函数,然后使用该对象。请注意,这仅适用于struct
而非class
es。对于class
es,您只能在没有static
运算符的情况下使用new
成员并使用class
的对象,您必须使用new
} operator。
答案 1 :(得分:2)
虽然您不需要new
来实例化一个结构,但编译器不允许您使用任何方法或属性,除非它的所有字段都已初始化。
您可以创建构造函数而不是setvalue
方法,也可以一个接一个地分配它:
StructureMethods book1;
book1.author = "ds";
book1.name = "";
book1.page = 1;
book1.id = 3;
book1.printinfo();
StructureMethods book2 = new StructureMethods("test","bbb",0,1);
book2.printinfo();
struct StructureMethods
{
public string name;
public string author;
public int page;
public int id;
public StructureMethods(string a, string b, int c, int d)
{
name = a;
author = b;
page = c;
id = d;
}
public void printinfo()
{
Console.WriteLine("Name : " + name);
Console.WriteLine("Author : " + author);
Console.WriteLine("Total Page No : " + page);
Console.WriteLine("ID : " + id);
}
}
Side-Note1:除非您在非void方法中返回某个值,否则不需要在函数末尾使用return;
。
Side-Note2:由于您提到您是C#的新手,请确保您了解何时使用结构和类。您可以启动here