我是否应该在C#Structures中使用“new”运算符,同时在其中声明成员函数?

时间:2017-04-15 18:08:43

标签: c# windows

请帮助任何人。这是我在这个网站上的第一个问题。

我是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”?但我的第一个代码成功编译。

2 个答案:

答案 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);
    }
}

总而言之,你必须:

  1. 初始化所有字段,然后您可以使用对象
  2. 使用new运算符调用构造函数,然后使用该对象。
  3. 请注意,这仅适用于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