2016-05-12 6 views
0

Я недавно преобразовал класс VB в C#, и, похоже, у меня возникла проблема; Я думаю, что знаю, как это решить, но со всем моим чтением. Теперь я ищу более четкий ответ с руководством. Рассмотрим следующий код со структурой FileDetail внутри (это просто пример - поэтому, пожалуйста, не предполагайте, что это FileDetail, как в файлах ..) Доступ к структуре должен осуществляться изнутри и снаружи - они передаются по значению, а не по ссылке типы, поэтому struct, похоже, является способом перехода сюда вместо класса (смотря на весь код). В классе формы MyForm я получаю ошибку, что FileDetails не существует в классе IAFT.Использование структур внутри классов из других классов

public class IAFT 
{ 
    public struct FileDetail 
    { 
     public string FileType; 
     public int FileNumber; 
    } 
} 

public class MyForm 
{ 
    MyForm() 
    { 
     public IAFT.FileDetail fd = new IAFT.FileDetail(); 
     // IAFT.FileDetail 
    } 
} 

ОШИБКА Я получаю. Тип типа 'FileDetail' не существует в типе 'IAFT' (CS0426) Красный squigly в VS2013 находится под объявлением типа; левой стороны задания.

Оба находятся в одном и том же пространстве имен, если это какая-либо помощь.

Я прочитал сообщения на SO, которые говорят мне, что я могу объявить переменную fd так же, как она выше (не имеет смысла для меня, поскольку у меня нет экземпляра, но я попробовал). Я не хочу создавать экземпляр для получения экземпляра; Я считаю, что я хочу, чтобы он существовал внутри экземпляра IAFT. Может быть, я чего-то не понимаю.

Должен ли я инкапсулировать структуру как класс? Должен ли я помещать структуру вне класса IAFT? [Это то, что я думал, что должен делать.]

Должен ли я сделать что-то еще?

+0

МОФТ должен быть статическим для вас получить к нему доступ без фактического создания экземпляра одного. – user3953989

+4

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

+1

, если вы публикуете свой «MyForm' ctor public и удаляете ключевое слово« public »внутри ctor, это фактически компилируется и запускается, как это нецелесообразно. – Jonesopolis

ответ

1

Ваш код неправильный и не компилируется. Ваша ошибка в том, что вы декантинг

public IAFT.FileDetail fd = new IAFT.FileDetail(); 

Внутри общественного конструктора. Вы не можете объявить область действия в переменной области действия. Если вы выберете публичную декларацию, ваш код будет просто отлично.

Так что попробуйте это;

public class IAFT 
{ 
    public struct FileDetail 
    { 
     public string FileType; 
     public int FileNumber; 
    } 
} 

public class MyForm 
{ 

    public MyForm() 
    { 
     IAFT.FileDetail fd = new IAFT.FileDetail(); 
    } 
} 

Его отличная практика для гнездования классов.

+1

'Отличная практика для гнездования классов. 'В этом случае он работает *. Это не значит, что это хорошая идея сделать это таким образом. – Servy

+0

Какое ваше оправдание вызывают здесь плохую практику? Он полностью поддерживается языком и может сделать код более аккуратным - это просто еще один способ пространства имен. Это имеет то преимущество, что вне класса вы должны ссылаться на него по его полному имени, потому что вы не можете использовать «использование». Его необычный, но действительный. – PhillipH

+0

@Servy Если вложенность имеет какой-либо смысл (она хранит данные только для этого класса, она используется для вызова только их функций и т. Д.). Я не вижу никаких проблем. Почему это не очень хорошая идея? (любопытно) – Gusman

-5

Я бы это так:

public class IAFT 
{ 
    fileDetail FileDetail = new fileDetail(); 
} 

public class fileDetail 
{ 
    public string FileType; 
    public int FileNumber; 
} 

public class MyForm 
{ 
    MyForm() 
    { 
     IAFT.FileDetail.FileType = "test"; 
     //IAFT.FileDetail 
    } 
} 

Я надеюсь, что это работает, я не проверял.

+0

Может кто-нибудь объяснить, почему это не очень хорошая идея? – TheSkilluminati

+1

Ну, это не сработает. IAFT не был инициализирован, а свойство FileDetail не является статичным, поэтому ... не компилируется. – PhillipH

0

Нет необходимости делать статическую структуру или перемещать ее снаружи, проблема заключается в том, что вы объявили var как общедоступный внутри функции, и это недопустимо, локальные переменные не имеют модификаторов доступа, поскольку они являются локальными.

Попробуйте это:

public class IAFT 
{ 
    public struct FileDetail 
    { 
     public string FileType; 
     public int FileNumber; 
    } 
} 

public class MyForm 
{ 
    public IAFT.FileDetail fd = new IAFT.FileDetail(); 
} 
Смежные вопросы