#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:
Модификаторы доступа — это ключевые слова, используемые для указания объявленной доступности элемента или типа. В этом разделе представлены четыре модификатора доступа:
С помощью модификаторов доступа можно указать следующие пять уровней доступности:
- общедоступный : Доступ не ограничен.
- защищено : Доступ ограничен содержащим классом или типами, производными от содержащего класса.
- Внутренний : Доступ ограничен текущей сборкой.
- защищенный внутренний: Доступ ограничен текущей сборкой или типами, производными от содержащего класса.
- частный : Доступ ограничен типом содержимого.
Все члены в 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. ДА. Оно делает. Частное предполагается для всех членов классов и структур.