Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c点课堂作业、家庭作业(非作弊)_C#_Class_Point - Fatal编程技术网

C# c点课堂作业、家庭作业(非作弊)

C# c点课堂作业、家庭作业(非作弊),c#,class,point,C#,Class,Point,我有个小问题。在我的家庭作业中,我必须创建并实现一个点类,它代表控制台屏幕上的点。它应该在控制台窗口的特定位置标记出字符“*”。例如,控制台页面的宽度应为80像素,最大高度应为49像素。赋值还有一个提示,提示我应该在MSDN中查找Console.SetCursorPosition()方法 那么,我已经走了多远?我创建了一个名为“点”的类,为协调器声明了2个int变量x和y,并创建了一个构造函数。但是我不确定构造器是否应该将这两个变量作为参数,以及它应该如何处理它们 注意:我不希望人们为我写这方面

我有个小问题。在我的家庭作业中,我必须创建并实现一个
,它代表
控制台
屏幕上的
。它应该在
控制台
窗口的特定位置标记出字符“*”。例如,
控制台
页面的宽度应为80像素,最大高度应为49像素。赋值还有一个提示,提示我应该在
MSDN
中查找
Console.SetCursorPosition()
方法

那么,我已经走了多远?我创建了一个名为“点”的
类,为协调器声明了2个
int
变量x和y,并创建了一个构造函数。但是我不确定构造器是否应该将这两个变量作为参数,以及它应该如何处理它们


注意:我不希望人们为我写这方面的全部代码;这不是我学习的方式。我写这篇文章是为了让在
C#
方面比我更有经验的人能帮助我找到正确的方法

您说过您被引导到该方法-该页面,特别是示例部分,应该对您非常有用


对于你的班级来说,如果你发布了一些代码,那么给出建议就更容易了。在C#中,有几种常见的方法可以在类的实例上设置变量:如果是,您可以在上传递值并让构造函数进行赋值,或者如果是,您可以直接设置它们。

通常,您会跌跌撞撞地进入有时会被宗教狂热讨论的领域。有些人提倡一个单阶段初始化过程,在这个过程中,构造函数总是产生一个有效且可用的对象,或者抛出一个异常。第二个想法是,构造函数为您提供一个“空白”对象,您可以稍后调用该对象,例如
init()
方法。构造函数给出的对象将不可用。这将被称为两阶段初始化

我碰巧是在中间的某个地方,但倾向于一个阶段。有时两阶段初始化有它的应用程序,IMO在大多数情况下没有。其他答案建议将
设置为不可变对象,在这种情况下,您必须使用构造函数初始化它

除了使对象不可变之外:如果没有充分的理由不在构造函数中初始化它,就不要这样做。如果不在构造中初始化值,则必须在初始化类之前检测类的使用情况(至少我会这样做,以防止出现错误),而不会从中获益

构造函数应该做什么:对照max/min值检查值并初始化字段。如果超出范围,则抛出异常。 如果对象是可变的,不要忘记在set方法中执行相同的操作


在这种情况下,您可以考虑使用属性并使类不可变,如他的回答中的CODESSIN混沌。

IMO。表示位置的类应该是不可变的值对象,因此它应该得到值语义。

我要做的是:

  • 创建一个类
    ConsolePoint
  • 必须
    private readonly int
    字段来存储坐标值
  • 有两个公共属性,其getter返回字段的值,而不是setter
  • 拥有一个构造函数,该构造函数接受这两个坐标,如果它们无效,则抛出
    ArgumentOutOfRangeException
    ,然后分配给字段
然后实现价值平等:

  • 覆盖
    等于
    GetHashCode
  • 重载
    ==
    =
这四点应该是一致的



但是,如果您喜欢可变类,我将创建两个可变字段和两个属性,它们的setter将验证坐标。由于这两个坐标的验证是独立的,因此这种方法效果很好。在这种情况下,我只使用默认构造函数。

有很多可能性。一种方法是编写一个构造函数,它接受两个参数,这两个参数对应于类中的两个字段
x
y
。然后,构造函数“body”应将第一个参数指定给
x
,将第二个参数指定给
y


请注意,如果您选择将构造函数参数命名为与字段完全相同的名称,则标识符
x
指的是参数,而不是字段。在这种情况下,您需要编写
this.x
来引用该字段。

如果您发布您创建的所谓代码,您将保持开放时间更长,获得更少的反对票。它将展示一些善意,让人们看到你确实做了一些事情。那么你在MSDN中查找了
控制台.SetCursorPosition()
方法了吗?@AbZy如果与他的问题无关,他为什么要查看
控制台.SetCursorPosition()
方法呢?问题是关于对象成员的架构和初始化,而不是背景故事?@AndreasWallner OP说:
在赋值上还有一个提示,wich说我应该寻找控制台。SetCursorPosition()方法。
@AbZy我仍然不知道该页面如何帮助回答这个问题。在C#中,您的成员保证被初始化为0。。因此,一个点在没有构造函数参数的情况下是有效的(除非出于某种原因0,0无效)。此外,正如CodesInChaos所提到的,这样的结构确实应该是不可变的(没有您建议的setter方法)。@SimonWhitehead感谢您的提示。。。我不知道C#中的成员保证被初始化为0,我将相应地更改我的答案。我不知道
控制台.SetCursorPosition
文档如何回答在任何方面提出的问题。你是对的,虽然OP应该发布一些cod