一个类中的两个构造函数?

时间:2011-11-14 15:48:30

标签: c#

这是我的代码:

class sample
    {
        public string str1 = "";
        public string str2 = "";
        public sample()
        {
            sample smp = new sample("BB", "EE");
        }
        public sample(string s1, string s2)
        {
            this.str1 = s1;
            this.str2 = s2;
        }
        public static void Main()
        {
            sample smpl = new sample();
            Console.WriteLine(smpl.str1);
            Console.WriteLine(smpl.str2);
            Console.ReadLine();

        }
    }

我将两个字符串值赋予我的变量,但没有发生任何事情。请问您能告诉我哪个问题?

4 个答案:

答案 0 :(得分:19)

您想使用this("BB", "EE")来调用其他构造函数。您在无参数构造函数中所做的是创建一个单独的,分配给本地smp变量的临时实例,这对str1或{{1}没有影响正在构造的对象的成员。

str2

答案 1 :(得分:10)

您在无参数构造函数中本地声明了sample对象。这与您实际构建的对象this是分开的。当该构造函数返回时,smp不再在范围内并且将被垃圾收集,同时您还没有初始化字符串(正如您所注意到的那样)。

您有两种选择:

  1. 只需将字符串初始化为默认值(请注意,如果您希望在所有构造函数中出现通用逻辑,则另一个选项可能更好)

    public sample()
    {
        this.str1 = "BB";
        this.str2 = "EE";
    }
    public sample(string s1, string s2)
    {
        this.str1 = s1;
        this.str2 = s2;
    }
    
  2. 使用构造函数声明中的this关键字来引用其他构造函数

    public sample() : this("BB", "EE")
    {
        // no need to do anything else, but you can do other things if the situation warrants
    }
    public sample(string s1, string s2)
    {
        this.str1 = s1;
        this.str2 = s2;
    }
    

答案 2 :(得分:5)

您正在无参数构造中创建sample的新实例。这会在返回后立即被丢弃,并且不会影响您正在使用的sample的当前实例。

您可能希望将其更改为:

public sample()
{
    this.str1 = "BB";
    this.str2 = "EE";    
}

可以省略this.

正如其他人指出的那样,另一个选择是使用以下方法调用其他构造函数:

public sample() 
    : this("BB", "EE")
{

}

阅读here

答案 3 :(得分:-4)

您在构造函数中指定局部变量,请尝试使用

this = new sample("BB", "EE");

编辑,正如所指出的那样

this.str1 = "BB";
this.str2 = "EE";