Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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# 所以我';I’我从来没有完全理解使用私人电脑的好处_C#_Java_C++ - Fatal编程技术网

C# 所以我';I’我从来没有完全理解使用私人电脑的好处

C# 所以我';I’我从来没有完全理解使用私人电脑的好处,c#,java,c++,C#,Java,C++,所以,尽管我的大学课程是编程课程,但他们从未真正解释过,即使我在谷歌上搜索过很多次,我也从未完全理解过。就安全而言,它更好吗 我现在正试图编写一个多类系统,并且正在将所有访问修饰符更改为public,因为否则,访问将不会被授予 有人能详细解释一下,并尽量让它容易理解吗 谢谢大家首先,修复错误变得容易了,因为你看不到很多变量和你的私有变量一起浮动 也许当你加入一个大项目时,你不希望任何其他程序员访问你的类文件的特殊部分,每个人都在做一部分工作,却不知道所有的项目。如果任何人都知道所有变量,那么他/

所以,尽管我的大学课程是编程课程,但他们从未真正解释过,即使我在谷歌上搜索过很多次,我也从未完全理解过。就安全而言,它更好吗

我现在正试图编写一个多类系统,并且正在将所有访问修饰符更改为public,因为否则,访问将不会被授予

有人能详细解释一下,并尽量让它容易理解吗


谢谢大家首先,修复错误变得容易了,因为你看不到很多变量和你的私有变量一起浮动

也许当你加入一个大项目时,你不希望任何其他程序员访问你的类文件的特殊部分,每个人都在做一部分工作,却不知道所有的项目。如果任何人都知道所有变量,那么他/她可以秘密地推销自己的项目(在团队之前完成)


最后,您的私有变量不是全局变量,这本身就是一种优化(可能不适用于java)。

使用
private
称为封装

它可以而且应该用于组织代码。这与安全无关

基本规则是所有数据(字段)都应该是私有的,并且只能通过公共成员(属性、方法)进行访问

这样,一个对象就可以对它自己正确的“对象状态”负责

封装是一个简单但非常强大的概念,即类应该有一个外部(公共接口)和一个内部(私有实现)。只有消费代码需要且安全使用的成员才应该是公共的


private
的意思不是“你可能不知道”,而是“你不必知道”

前面的回答中没有提到的另一点是对代码可维护性的影响——所有变量都是公共的,任意数量的类都可以引用它们。如果要更改一个类的工作方式,还需要修改所有这些类。因此,您可能需要更改其他类的内部结构,从而获得一个漂亮的蝴蝶效果。另一方面,如果您将内部设备私有,只具有抽象接口,那么您可以修改类实现,同时保持旧的接口,而不需要在类之外进行更改。

< P>我这里只讲C++。
private
有时非常有用。假设您有一个相当大的代码库。假设您试图在一个类中查找某个字段的所有用户,可能是因为您想删除它。您可以将该字段设置为私有。然后会出现友好的编译错误,告诉您所有用户的确切位置

private
在信息隐藏方面并不是很好,因为它实际上并不隐藏任何信息。在重载成员函数的情况下,这可能是一个真正的问题。如果基类有一个名为
base::foo(double)
的公共成员,并且您创建了一个私有的
derived::foo(int)
,这不是错误。但是,重载解析只能找到
派生::foo
,即使它是私有的


我还要指出,进行信息隐藏的正确方法是使用私有属性并通过getter和setter访问它们的另一个好处是,您可以使用这些函数在实际设置值之前对其进行操作

这里有一个例子。在Doctrine(用PHP编写并用于与数据库交互)中,您创建了一个包含要发送到数据库的值的对象。添加的数据通常来自表单。在数据库中,某些值可以为null。显然,如果表单中的值为空,则应将该值设置为null。但它不是这样工作的——它只是被设置为一个空字符串,而您不会得到要发送到数据库的空值

要使其正常工作,您可以设置setter函数,如下所示:

public function setName($name)
{
    if ($name === '') {
        $this->name = null;
    } else {
        $this->name = $name;
    }

    return $this;
}
如您所见,函数检查空字符串,然后将类的$name属性设置为null(如果是这种情况)。然后,该空值将被发送到数据库,而不是空字符串


如果您在许多地方使用该方法,这尤其有益。没有它,每次设置空值时都必须检查它们。通过在类的setter中进行检查,这使它变得更容易,因为您不必考虑它。

实际上与安全性无关。Private用于使things类的实现成为内部的。该成员开始获得分配给它的奇怪值。现在,您的整个代码库都可以访问该成员。祝你好运找到百万人中的哪一行负责。除了@chris comment外,它还可以更容易地决定更改。假设如果要更改字段的类型或含义,那么添加一个特性或修复一个bug会更容易。如果它是私有的,那么所有可能受影响的代码都在一个文件中,并且很容易找到。如果没有,您还有很多工作要做。因此,将方法公开,将变量私有?所有字段私有,将大多数/某些方法公开。使对象处于无效状态的方法应保持私有状态。好吧,假设我有一个窗体和一个类,Form foo有一个标签“text”,该标签传递给类栏,栏将运行String.IsNullOrEmpty(foo.text.text),然后将值返回给foo。对于公共/私有修饰符,我将如何执行此操作?另请参见。我认为很多方法也可以是
私有的
,或者
受保护的
或者
内部的
。这完全取决于谁要为他们操心。所谓的实现细节不应该是公开的。表单不应该公开任何控件,所以创建一个MyForm.LabelText属性。但这仍然不对,业务层不应该知道UI。