C # вопрос для VBer.Должны ли частные поля быть объявлены статическими? - PullRequest
3 голосов
/ 18 августа 2010

Я программист vb.net, переходящий на C #.

У меня есть следующий код для консольного приложения (с таргетингом на NET20)

using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;


namespace eScoreSwapper
{
    class Program
    {
        private string _dbName = ConfigurationManager.AppSettings["dbName"];

        static void Main(string[] args) {}

        static void InitVars()
        {
            if (string.IsNullOrEmpty(_dbName)) _dbName = "";
        }
    }
}

Это приводит к ошибке компиляции в предложении if InitVars для переменной _dbName:

Error   1   An object reference is required for the non-static field, method, or property 'eScoreSwapper.Program._dbName'   C:\Users\SethS\Documents\eScore\Versions\Trunk\dotNet\eScoreSwapper\eScoreSwapper\Program.cs    26  38  eScoreSwapper

Это потому, что это правда. C # не позволяет ссылаться на поля частного класса, если они не объявлены статическими? Я уверен, что я делаю что-то не так.

Пока я могу это сделать, я могу задать еще один вопрос по C #. Почему утверждение if действительно? Почему брекеты не требуются? Действителен ли синтаксис, если за условием следует одно выражение (как в t-sql IF).

Спасибо за вашу помощь.

Сет

Ответы [ 7 ]

8 голосов
/ 18 августа 2010

Нет, но закрытые поля, используемые статическим методом, делают. Я думаю, что вы действительно хотите сделать, это удалить static из объявления InitVars().

Я предполагаю, что вы ранее пробовали:

static void Main(string[] args) 
{
   InitVars();
} 

и это не удалось, поэтому вы добавили static в InitVars (). Неправильный ответ. По сути, вы должны притворяться, что Main () не является частью класса.

static void Main(string[] args) 
{
   Program prog = new Program();
   prog.InitVars();
} 

Что касается оператора If ()

if (string.IsNullOrEmpty(_dbName)) _dbName = "";

это просто короткая версия:

if (string.IsNullOrEmpty(_dbName)) 
     _dbName = "";

Теперь на языке C-ish официально if (), равный true, выполнит (один) следующий оператор. Но вы можете сделать несколько заявлений в одно утверждение, заключив их в фигурные скобки. Но если у вас есть только одно утверждение, оно не нужно.

5 голосов
/ 18 августа 2010

Нельзя использовать переменную-член экземпляра в статическом методе.Либо сделайте вашу переменную статической, либо поместите метод и переменную в класс экземпляра и добавьте ее в main в программе.

Причина, по которой вы не можете получить доступ к переменной экземпляра из статического метода, становится очевидной, когда вы думаете отот факт, что метод существует «в классе», а переменная существует «в экземпляре».Надеюсь, это поможет.

В качестве заключительного комментария я бы просто добавил, что тот факт, что компилятор выдает ошибку, не имеет ничего общего с тем, что ваше поле является приватным;если ваше поле было публичным, внутренним и т. д., компилятор все равно выдал бы вам ту же ошибку: т.е.статические методы не могут получить доступ к переменным экземпляра.

1 голос
/ 18 августа 2010

Вы не можете получить доступ к нестатическому члену класса из статического метода, не используя параметр метода для получения ссылки на член класса.

Синтаксис if нормальный c # (c ++, c).Скобы требуются только для сложных многострочных блоков.Следующее другое также может иметь особую линию.

1 голос
/ 18 августа 2010

Чтобы ответить на вопрос о фигурных скобках, они действительно обязательны в C #, если в блоке if имеется более одного оператора.В противном случае вы можете поместить однострочник в ту же строку, что и if, или в следующую строку.Я считаю, что в стандартах кодирования обычно рекомендуется использовать скобки.Всегда часто советуют не помещать всю серию кода во все строки, но этот вид исчезает, когда мы получаем третичные и нулевые операторы слияния.

1 голос
/ 18 августа 2010

Вы не можете получить доступ к нестатическому члену в статическом методе.

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

0 голосов
/ 19 августа 2010

"статический" на языке VB будет "общим".

0 голосов
/ 18 августа 2010

Вы пытаетесь получить доступ к полю экземпляра из статического контекста.Поскольку _dbName не помечен как статический, он может быть разным для каждого экземпляра класса Program, поэтому статический метод InitVars() не может узнать, какое значение является правильным.

Есликаждый экземпляр Program будет иметь одинаковое значение для _dbName, тогда _dbName должен быть помечен как статический.Если разные экземпляры могут иметь разные значения, тогда InitVars() должен быть методом экземпляра (удалите ключевое слово static и вызывайте его только для реальных объектов Program, а не для статического Main).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...