Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: работа со структурами Добавлено: 08.08.10 16:47  

Автор вопроса:  Ant
почему вылетает ошибка "Access of shared member through an instance; qualifying expression will not be evaluated"?

код такой

public structure myStruct
a1
a2
end structure

public class myClass
public function myFunction as myStruct 'вот так можно вообще?
dim retval as new myStruct
retval.a1=1 'вот это не прокатывает, почему?
return retval
end function
end class

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 08.08.10 17:57
1. У полей нужно указывать модификатор доступа (public/private/...), а можно даже и тип (Integer, String и т.п.)
2. MyClass - это зарезервированое ключевое слово в языке VB .NET (используется для доступа к текущему экземпляру класса, наряду с Me и MyBase). Если нужно создать тип с именем MyClass, то нужно писать [MyClass]
3. .....
4. PROFIT!!!

  1.     Public Structure myStruct
  2.         Public a1
  3.         Public a2
  4.     End Structure
  5.  
  6.     Public Class [MyClass]
  7.         Public Function myFunction() As myStruct 'вот так можно вообще?
  8.             Dim retval As New myStruct
  9.             retval.a1 = 1 'вот это не прокатывает, почему?
  10.             Return retval
  11.         End Function
  12.     End Class


В таком виде код компилируется без ошибок. Я не говорю про ужасную нотацию, отсутствие указания типов и про то что в 99% случаев в такой ситуации нужно использовать не структурный тип (Structure), а ссылочный (Class).

Ответить

Номер ответа: 2
Автор ответа:
 Ant



Вопросов: 1
Ответов: 7
 Профиль | | #2 Добавлено: 08.08.10 19:17
Странно, а у меня 2010 студия кидает эксепшн на строке retval.a1 = 1 , то есть на прямом присвоении значения члену структуры.

Обошелся таким методом:
  1. #Public  Structure myStruct
  2. #    Public a1
  3. #    Public a2
  4. #    Public Sub SetValues(inA1, inA2)
  5. #       a1 = inA1
  6. #       a2 = inA2
  7. #    End Sub
  8. #End Structure


...и вот так - retval.SetValues(100,200) - присвоение работает без ошибок. чтение же значений retval.a1 проходит нормально.

может быть, играет роль объявление членов структуры как Public Shared? сейчас делаю всё тупо "по книжке", где я неправ в мелочах - разбираться буду потом))

P.S. типы в примере не указывал, можно сказать, специально - дело не в них, писал этот код вручную потому что.
P.P.S. не мог бы ты набросать пример использования ссылочного типа в моей ситуации? как это пишется всё синтаксически, если использовать структуру я хочу в модуле формы? где объявлять класс - над классом формы или внутри его, и т.п.? ну не въезжаю я ещё во все эти классы после VB6 :)

Ответить

Номер ответа: 3
Автор ответа:
 Ant



Вопросов: 1
Ответов: 7
 Профиль | | #3 Добавлено: 08.08.10 19:25
ёпрст! Public Shared!!! :(

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 08.08.10 20:09
Исключения не может быть, если у тебя исклюение, значит ты что-то менял в коде.

Shared - это общий член типа, и он в данном случае не нужен. Shared не указывается.

Чтоб ссылочный тип сделать, все так же, но вместо Structure пишешь Class

Ответить

Номер ответа: 5
Автор ответа:
 Ant



Вопросов: 1
Ответов: 7
 Профиль | | #5 Добавлено: 08.08.10 20:14
исключение вылетало на присвоении значения retval.a1 тогда, когда в структуре a1 объявлялся как Public Shared a1

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 08.08.10 20:21
код в студию

Ответить

Номер ответа: 7
Автор ответа:
 Ant



Вопросов: 1
Ответов: 7
 Профиль | | #7 Добавлено: 08.08.10 20:22
  1. Public Enum RecTypes
  2. NoData = 0
  3. Header = 1
  4. Footer = 2
  5. Name = 3
  6. Work_PhoneNumber = 3
  7. Home_PhoneNumber = 4
  8. Email = 5
  9. End Enum
  10.  
  11. Public Structure tmplDataRow
  12. Public Shared outRecType As RecTypes
  13. Public Shared outRecName As String
  14. Public Shared outRecData As String
  15. Public Sub SetValues(ByVal RecType As RecTypes, ByVal RecName As String, ByVal RecData As String)
  16. outRecType = RecType
  17. outRecName = RecName
  18. outRecData = RecData
  19. End Sub
  20. End Structure

Ответить

Номер ответа: 8
Автор ответа:
 Ant



Вопросов: 1
Ответов: 7
 Профиль | | #8 Добавлено: 08.08.10 20:28
  1. Private  Function ParseParameter(ByVal inStrVal As String) As tmplDataRow
  2.      Dim retval As New tmplDataRow
  3.      'точнее, код выглядит так
  4.      retval.outRecName = "строка" 'тут ошибка
  5.      
  6.      Return retval
  7.  End Function


запутался уже в примерах и реальном коде))

Ответить

Номер ответа: 9
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 08.08.10 20:30
Исключения нет, только warning (обращение к общему члену типа через экземпляр типа). Shared нужно везде убрать.

Ответить

Номер ответа: 10
Автор ответа:
 Ant



Вопросов: 1
Ответов: 7
 Профиль | | #10 Добавлено: 08.08.10 20:35
я уж понял. потихоньку въезжаю в концепцию ( http://msdn.microsoft.com/ru-ru/library/4hbsxy95%28VS.90%29.aspx )

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам