C#:我无法从另一个类访问私有字段的属性

时间:2018-03-10 07:21:09

标签: c# visual-studio unity3d unityscript

私有静态字段numberOfPlayersInOfflineGame具有属性。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameData
{
    private static int numberOfPlayersInOfflineGame;

    int NumberOfPlayersInOfflineGame
    {
        get
        {
            return numberOfPlayersInOfflineGame;
        }
        set
        {
            numberOfPlayersInOfflineGame = value;
        }
    }
}

这里我试图从另一个类访问上述字段的值。但是你可以看到我无法访问它。

我正在使用Unity的Visual Studio社区。

enter image description here

2 个答案:

答案 0 :(得分:5)

这是private字段的目的 - 无法从其他类访问它们。但是制作字段public不是可行的方法。通常,C#开发人员将字段包装在public属性中,该属性可以通过验证来实现转换。这几乎就是你所做的,你没有明确地创建属性public,这是必要的。

默认会员可见度为private,因此您应该设置属性public

public class GameData
{
   private static int numberOfPlayersInOfflineGame;

   public static int NumberOfPlayersInOfflineGame
   {
      get
      {
         return numberOfPlayersInOfflineGame;
      }
      set
      {
         numberOfPlayersInOfflineGame = value;
      }
   }
}

但我反对@Agent_Orange建议:不要让你的领域public!这完全违背了创建属性的目的。任何代码都可以绕过属性设置器中的潜在验证,将numberOfPlayersInOfflineGame设置为-100之类的任何意外值。

正如@Jon Skeet所说 - 如果你没有在属性的getter和setter中执行任何其他任务,你可以通过使代码成为自动属性来简化代码:

public class GameData
{
   public static int NumberOfPlayersInOfflineGame { get; set; }
}

现在,您可以在类代码和类外部使用属性而不是字段。如果您以后决定添加一些验证,您可以随时返回由私有字段支持的属性。

答案 1 :(得分:2)

答案

只能在类本身内访问私有字段。要在外部访问它,通常会将其公开或创建一个返回私有变量的公共方法。

精化

Public,Private等是我们所说的访问修饰符。

将公共getter方法设置为私有变量而不是生成公共变量的优点是,您可以控制在获取变量时发生的事情。

在下面的部分中,我引用了官方文档中有关不同类型修饰符的说明。

  

访问修饰符(C#编程指南)

     

所有类型和类型成员都具有可访问级别,该级别控制是否可以从程序集或其他程序集中的其他代码使用它们。您可以使用以下访问修饰符在声明类型或成员时指定其可访问性:

     

公开   类型或成员可以由同一程序集中的任何其他代码或引用它的另一个程序集访问。

     

<强>私有   只能通过相同类或结构中的代码访问类型或成员。

     

<强>保护   类型或成员只能由同一个类中的代码访问,或者在从该类派生的类中访问。   内部   类型或成员可以由同一程序集中的任何代码访问,但不能从另一个程序集访问。

     

protected internal 类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。

     

private protected 只能在其声明程序集中,通过同一类中的代码或从该类派生的类型中访问类型或成员。

来源: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers