Недоступна из-за ее уровня защиты?

#c# #abstract-class

Вопрос:

Я все еще новичок в программировании в целом, и хотя эта простая программа предназначена только для проверки того, как работают конструкторы, я все равно хотел бы знать, почему я получаю эту ошибку.

     using System;

    public class methodTest
    {
        int a;
        int b;
        int c;
         public methodTest(int i, int j, int k)
        {
            a = i;
            b = j;
            c = k;
        }
    }

    public class methodObj
    {
        static void Main()
        {
        methodTest obj = new methodTest(10, 20, 30);
        Console.WriteLine("obj = "   obj.b);
        Console.ReadKey();
        }
    }
 

Я не совсем понимаю, почему я получаю ошибку. Проблема в консоли.Линия записи, где говорится, что она не может получить доступ к объекту.б. Переменные, похоже, объявлены в общедоступном классе, так почему же к ним нельзя получить доступ? Я попытался найти решение этой проблемы, но все вопросы, которые я нашел, были слишком запутанными, чтобы я мог получить ответ, который я мог бы перевести в свое собственное понимание.
Вся помощь признательна!

Комментарии:

1. Переменные являются неявными private . При отсутствии спецификатора доступа они недоступны для всего , что не является этим точным классом.

2. @EBrown стоит отметить, что частные переменные здесь, a, b и c, точнее называются полями.

3. @phoog Действительно, добавив это и к моему ответу.

Ответ №1:

Даже если переменные относятся к общедоступному классу, они должны быть объявлены как общедоступные, поскольку по умолчанию они являются частными.

См.: Модификаторы доступа

Члены класса, включая вложенные классы и структуры, могут быть общедоступными, защищенными внутренними, защищенными, внутренними или частными. Уровень доступа для членов класса и членов структуры, включая вложенные классы и структуры, по умолчанию является закрытым.

Рекомендуется использовать заглавные имена и свойства для открытых переменных.

 public A { get; set; }
 

Свойства позволяют управлять доступом к чтению/записи элемента, а также добавлять логику при их чтении или настройке.

Ответ №2:

Модификаторы доступа — это ключевые слова, используемые для указания объявленной доступности элемента или типа. В этом разделе представлены четыре модификатора доступа:

С помощью модификаторов доступа можно указать следующие пять уровней доступности:

  1. общедоступный : Доступ не ограничен.
  2. защищено : Доступ ограничен содержащим классом или типами, производными от содержащего класса.
  3. Внутренний : Доступ ограничен текущей сборкой.
  4. защищенный внутренний: Доступ ограничен текущей сборкой или типами, производными от содержащего класса.
  5. частный : Доступ ограничен типом содержимого.

Все члены в C# неявно являются закрытыми, поэтому в вашем вопросе a,b и c определены как private и, поэтому вы не могли получить к ним доступ извне methodTest . для получения дополнительной информации вам, возможно, потребуется заглянуть на эту страницу : Модификаторы доступа (Руководство по программированию на C#)

Удачи! 🙂

Ответ №3:

Это не вызвано конструктором. Вы получаете ошибку, потому что поле methodTest.b является закрытым (в C# поля являются закрытыми по умолчанию; вам нужно указать явный модификатор, что-то вроде public int b; ).

Ответ №4:

Если вы хотите получить доступ к целым числам a, b и c из-за пределов класса, в котором они созданы, вы должны объявить их как public . Однако более чистым вариантом является использование свойства, такого как:

 public int A {get; set;}
public int B {get; set}
public int C {get; set;}
 

Это позволяет вам потенциально ограничить доступ на запись из внешних классов, оставляя при этом свойства открытыми для чтения, такие как:

 public int A {get; private set;}
public int B {get; private set}
public int C {get; private set;}
 

Ответ №5:

Ваша проблема заключается в том, что в C# переменные (в данном случае fields ) помечены так, как private будто они специально не помечены модификатором доступа.

https://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx

Классы и структуры по умолчанию internal , поля, методы, события, свойства и т. Д. (В основном, все члены classes и structures ) по умолчанию private .

Изменение int a на public int a (и то же самое для b/c) исправит это.

Хотя я рекомендую этого не делать. Вместо этого создайте свойство для каждого.

 public A { get { return a; } set { a = value; } }
public B { get { return b; } set { b = value; } }
public C { get { return c; } set { c = value; } }
 

Комментарии:

1. Кроме того, разве правило «закрыто по умолчанию» не применяется ко всем членам класса и структуры, включая свойства, методы и события? Это не переменные.

2. ДА. Оно делает. Частное предполагается для всех членов классов и структур.