【问题标题】:C# constructors with parameters - passing on带参数的 C# 构造函数 - 传递
【发布时间】:2015-01-14 00:58:41
【问题描述】:

我有一个关于我的 Windows 窗体应用程序的构造函数的问题。首先我想说我是编程新手。

事情是这样的。我正在另一个类中创建一个构造函数,该类应该包含不同的参数值。在这种情况下,它应该是 int X、int Y、int Length、int Height。我在这里要做的是让我的图片框的 X、Y、长度和高度都是随机的。我在下面发送代码:

class Rechthoekcs
{
    Random random = new Random();

    public int Xas
    {
        get;
        set;
    }
    public int Yas
    {
        get;
        set;
    }
    public int Lengte
    {
        get;
        set;
    }
    public int Breedte
    {
        get;
        set;
    }
    public Rechthoekcs(int x, int y, int lengte, int breedte)
    {
        this.Xas = x;
        this.Yas = y;
        this.Lengte = lengte;
        this.Breedte = breedte;
        x = random.Next(x);
        y = random.Next(y);
        lengte = random.Next(lengte);
        breedte = random.Next(breedte);
    }

从我的 Form1 我想调用这个类/构造函数

但它给了我一个错误。它说“不包含带有 0 个参数的构造函数”,我知道这是因为我输入了 x、y、长度和宽度。但我不能只将其他类的变量添加到新参数中。我真的不明白。我发现构造函数非常困难。我永远不知道我应该给它什么参数......

我从我的 Form1 将代码发送到下面:

public partial class Form1 : Form
{
    Rechthoekcs Rechthoek = new Rechthoekcs(.......);
    public Form1()
    {
        InitializeComponent();
    }

这真的让我很沮丧。我尝试在网络和书籍等上查找,但我不清楚关于应该为构造函数提供哪些参数的所有解释。有人可以解释一下吗?不理解它让我发疯。另外,我经常卡在这些点上..

【问题讨论】:

  • 那么您的其他班级是否能够传递数据?要么可以,但您需要输入值,要么不能,并且该类的构造函数中不能有参数。
  • 您不知道这些值,因为它们来自表单(或其他来源)?然后在知道值之前不要调用构造函数。
  • 您始终可以创建一个字段并稍后调用构造函数:Rechthoekcs Rechthoek; 和稍后的Rechthoek = new Rechthoekcs(...),当您知道正确的值时。
  • 您希望传递给 Rechthoekcs 的构造函数的值来自哪里?请注意,您可以保留“Rechthoek”变量而不给它一个值。例如。你可以有“Rechthoekcs Rechthoek;”上面 Form1 的构造函数,并在你使用它之前给 Rechthoek 赋值。

标签: c# constructor parameter-passing


【解决方案1】:
public Rechthoekcs(int x, int y, int lengte, int breedte)
{
    this.Xas = x;
    this.Yas = y;
    this.Lengte = lengte;
    this.Breedte = breedte;
    x = random.Next(x);
    y = random.Next(y);
    lengte = random.Next(lengte);
    breedte = random.Next(breedte);
}

在对私有数据成员执行任何“随机化”操作之前,您正在将参数的值分配给它们。您只是在构造函数中更改参数的值而不分配它们。交换你做它们的顺序。

public Rechthoekcs(int x, int y, int lengte, int breedte)
{

    x = random.Next(x);
    y = random.Next(y);
    lengte = random.Next(lengte);
    breedte = random.Next(breedte);

    this.Xas = x;
    this.Yas = y;
    this.Lengte = lengte;
    this.Breedte = breedte;
}

现在您已经成功地将您的值随机化,这些值将设置为您的数据成员变量假设您放入其中的那些变量确实存在,它们应该存在。更好/更模块化的代码会在您创建对象的地方进行这种随机化。

例如:Object foo = new Object(new Random, new Random, new Random, new Random)

【讨论】:

    【解决方案2】:

    不是 OP 正在寻找的答案,但这就是您解决“我还不知道值,但无论如何我需要构造对象”版本的问题的方法。

    您可以通过为每个参数传递Func<T> 而不是只传递T 来延迟请求数据,假设这些值实际上将在需要时可用:

    class UseDelayedValues
    {
        Func<int> x;
        public UseDelayedValues(Func<int> x)
        {
           this.x = x;
        }
    
        public UseWithX(int other)
        {
           return other + x();
        }
    }
    
    int value = 0;
    var r = new UseDelayedValues(() => value);
    value = 42;// get some value 
    Console.WriteLine(r.UseDelayedValues(1));
    
    var delayedFromTextbox = new UseDelayedValues(() => int.Parse(textBox1.Value));
    

    使用UseDelayedValues 的行可以随时间分布。 IE。在构造函数中构造的实例,但值仅在通过按钮单击显示表单时使用。

    【讨论】:

      猜你喜欢
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 2014-12-25
      • 1970-01-01
      相关资源
      最近更新 更多