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

Enz*_*zio 0 c# unity-game-engine visual-studio unityscript

private static field 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

Mar*_*und 6

这是private字段的目的- 它们不能从其他类访问.但是,制造这个领域public并非如此.通常,C#开发人员将该字段包装在public属性中,该属性可以具有实现的转换验证.这几乎就是你所做的,你没有明确地做出属性public,这是必要的.

默认会员可见性是private您应该建立您的财产public:

public class GameData
{
   private static int numberOfPlayersInOfflineGame;

   public static int NumberOfPlayersInOfflineGame
   {
      get
      {
         return numberOfPlayersInOfflineGame;
      }
      set
      {
         numberOfPlayersInOfflineGame = value;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class GameData
{
   public static int NumberOfPlayersInOfflineGame { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 正如我在对Agent_Orange的回答的评论中所指出的那样:如果您的属性只是以一种微不足道的方式公开该字段,那么我们就是一个自动实现的属性.您可以随时从该属性转到属性并稍后进行验证. (2认同)
  • 谢谢你的解释.我之前已经完成了Java,所以我假设默认成员visibility ="可以从包中的其他类访问".我不知道它在C#中是私有的. (2认同)
  • 我想添加一个关于Unity本身的东西:如果你使用autoproperties或具有普通属性的私有字段,Unity将不会序列化该字段,因此该变量在Inspector中不可见.因此,在Unity中使用属性的最佳方法是使用公共属性,私有字段并使用`[SerializeField]`标记字段. (2认同)