2010-08-12 3 views
1

У меня есть класс, как следующее:Как я буду использовать следующую статическую переменную из другого класса?

public class Trainee 
{ 

    private static int numberOfTrainee = 30; 

    private string traineeName; 
    private string tarineeId; 
} 

Теперь я хочу, чтобы получить доступ к статическим данным «numberOfTrainee» в следующем классе без создания объекта класса «Ученик», и я не хочу, чтобы написать геттер для "numberOfTrainee". Потому что статический член может использоваться только с помощью.. оператор.

public class TraineeUI : Form 
{ 
    private void showButton_Click(object sender, EventArgs e) 
    { 
     // I want to access "numberOfTrainee" here. Something like following: 
     // MessageBox.Show("Total number of trainee is: "); 

    } 
} 

ответ

1

Я не хочу, чтобы переработать то, что другие сказали, но ....

Вы должны смотреть на модификаторы доступа. Вы говорите, что не хотите, чтобы numberOfTrainee публично, но вы можете сделать его внутренним. Таким образом, если Trainee и TraineeUI находятся в одной и той же сборке, то TraineeUI может получить доступ к полю Trainee, не подвергая поле воздействию типов вне сборки.

Я бы сделал это свойство вместо поля.

+0

Спасибо, мистер Аббутт за хорошее предложение. – Towhid

0

Ну, как вы могли бы сделать его публичным, а затем просто CALLL его:

Trainee.numberOfTrainee 

Или вы можете создать статическую только для чтения свойства.

public static int NumberOfTrainee 
{ 
    get 
    { 
     return numberOfTrainee; 
    } 
} 
+0

Я не хочу публиковать «numberOfTrainee». Тогда что мне делать? (Может быть, я задаю глупый вопрос !!) – Towhid

+1

Но ваша потребность/желание получить доступ к значению вне класса означает, что вы хотите сделать его общедоступным. Если вы можете дать нам некоторые указания относительно того, почему вы не хотите обнародовать его, что, возможно, позволит нам более четко ответить на ваш вопрос. –

+0

: Спасибо ho1. @ Daz Lewis :: На самом деле мне было любопытно, можно ли или невозможно получить доступ к приватным статическим данным из другого класса без записи свойства в той же сборке. Благодарю. – Towhid

3

Вы должны сделать свойство, например:

public class Trainee 
{  
    private static int numberOfTrainee = 30; 

    public int TraineeCount { get { return numberOfTrainee; } } 

    private string traineeName; 
    private string tarineeId; 
} 

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

Далее, следует отметить, что, делая это свойство, а не дает прямой доступ к полю, вы:

  • Можно добавить дополнительную логику, если вы когда-либо хотите
  • Можно сделать свойство только для чтения, но изменить поле внутри класса
  • Keep инкапсуляция нетронутыми: свойство является частью API класса, в то время как поле является деталью реализации
+0

Спасибо, мистер Скит. – Towhid

4

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

public class Trainee 
{ 
    public static int NumberOfTrainee = 30; 
    private string traineeName; 
    private string tarineeId; 
} 

// Other code. 
MessageBox.Show("Total number of trainee is: " + Trainee.NumberOfTrainee); 

Однако, я бы не рекомендовал делать это с поля, может измениться. Если это не константа, вы должны определить property для управления доступом к этому полю, статическим или нет.

+0

Спасибо Rich за предложение, связанное с безопасностью. – Towhid

Смежные вопросы