Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение .Net примитивом из реестра - не возвращает дефолт. / 15 сообщений из 15, страница 1 из 1
20.01.2015, 16:49
    #38858702
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Ну скажем:
Код: vbnet
1.
    MsgBox(My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\AppTest\SubTest", "TestValue", "NoValue"))



Если нету параметра "TestValue", но есть раздел "SubTest" то вернет "NoValue" -согласен.
А вот если нету раздела "SubTest" то вернет пустую строку - НЕ согласен.

Не, могу извернуться:
Код: vbnet
1.
2.
    My.Computer.Registry.CurrentUser.CreateSubKey("Software\AppTest\SubTest")
    MsgBox(My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\AppTest\SubTest", "TestValue", "NoValue"))


тогда вернет "NoValue"

Фигня какая-то, а если я не хочу создавать раздел (если его нет), при этом чтоб возвращала дефолт.
Понятно, что могу написать свою ф-цию и делать сначала Registry.CurrentUser.OpenSubKey для проверки через Try/Catch,
но меня бесит что штатная не работает.
...
Рейтинг: 0 / 0
20.01.2015, 18:43
    #38858836
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Дмитрий77,

..в данном случае дефолтом будет не просто NoValue, но и NoSuchDirectory .. все равно проверять надо, нет?
...
Рейтинг: 0 / 0
20.01.2015, 19:25
    #38858877
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
carrotik,

в данном примере дефолтом должна быть текстовая "NoValue", в том числе если ветка реестра вообще отсутствует.
Да пофиг, ветку где прога хранит свои настройки (где их много) можно и создать.

А вот в каких-то других частных случаях об этом глюке лучше помнить.
...
Рейтинг: 0 / 0
21.01.2015, 01:32
    #38859091
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
вместо того, чтобы предаваться ангсту, написал бы свою функцию, возвращающую что нужно. вопрос-то копеечный, на сруль больше времени потратил.
...
Рейтинг: 0 / 0
21.01.2015, 01:36
    #38859092
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Antonariy,

да написал уже


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
  Public Function RegGetDword_Net(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal valueName As String, Optional ByVal defaultValue As Integer = 0) As Integer
    Try
      Dim reg_key As RegistryKey = Key.OpenSubKey(SubKey)
      If reg_key.GetValueKind(valueName) = RegistryValueKind.DWord Then
        Return reg_key.GetValue(valueName, defaultValue)
      Else
        Return defaultValue
      End If
    Catch
      Return defaultValue
    End Try
  End Function

  Public Function RegSetDword_Net(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal valueName As String, ByVal value As Integer) As Boolean
    Try
      Dim reg_key As RegistryKey = Key.CreateSubKey(SubKey)
      reg_key.SetValue(valueName, value, RegistryValueKind.DWord)
      Return True
    Catch
      Return False
    End Try
  End Function

  Public Function RegGetValue_Net(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal valueName As String, Optional ByVal defaultValue As String = vbNullString) As String
    Try
      Dim reg_key As RegistryKey = Key.OpenSubKey(SubKey)
      If reg_key.GetValueKind(valueName) = RegistryValueKind.String Then
        Return reg_key.GetValue(valueName, defaultValue)
      Else
        Return defaultValue
      End If
    Catch
      Return defaultValue
    End Try
  End Function

  Public Function RegSetValue_Net(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal valueName As String, ByVal value As String) As Boolean
    Try
      Dim reg_key As RegistryKey = Key.CreateSubKey(SubKey)
      reg_key.SetValue(valueName, value, RegistryValueKind.String)
      Return True
    Catch
      Return False
    End Try
  End Function

...
Рейтинг: 0 / 0
01.03.2015, 12:00
    #38891613
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Что я понял
Try...Catch - это зло
если этим пользоваться для проверки чего-либо.
Исключения очень долго отрабатывают.

Если моими ф-циями выше прочесть этак несколько десятков параметров из реестра, а их там нет,
то задержка будет исчисляться секундами (тест показывает 200мс на попытку чтения 40 параметров с отработкой Catch).

Переделал так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  Public Function RegGetDword_Net(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal valueName As String, Optional ByVal defaultValue As Integer = 0) As Integer
    Try
      Dim reg_key As RegistryKey = Key.OpenSubKey(SubKey)
      If reg_key Is Nothing Then Return defaultValue 'нет раздела
      Dim reg_value As Object = reg_key.GetValue(valueName)
      If reg_value Is Nothing Then Return defaultValue 'нет параметра
      If reg_key.GetValueKind(valueName) = RegistryValueKind.DWord Then Return CType(reg_value, Integer)
      Return defaultValue 'неправильный тип параметра
    Catch
      Return defaultValue 'на крайняк
    End Try
  End Function


  Public Function RegGetValue_Net(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal valueName As String, Optional ByVal defaultValue As String = vbNullString) As String
    Try
      Dim reg_key As RegistryKey = Key.OpenSubKey(SubKey)
      If reg_key Is Nothing Then Return defaultValue 'нет раздела
      Dim reg_value As Object = reg_key.GetValue(valueName)
      If reg_value Is Nothing Then Return defaultValue 'нет параметра
      If reg_key.GetValueKind(valueName) = RegistryValueKind.String Then Return CType(reg_value, String)
      Return defaultValue 'неправильный тип параметра
    Catch
      Return defaultValue 'на крайняк
    End Try
  End Function
...
Рейтинг: 0 / 0
01.03.2015, 12:33
    #38891634
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Дмитрий77,

А каким профилировщиком проверяете?
...
Рейтинг: 0 / 0
01.03.2015, 13:02
    #38891670
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
VSVLAD,

Код: vbnet
1.
2.
3.
    Dim std As Date = Now
'код время выполнения которого надо оценить
    Debug.Print((Now - std).ToString())


Вывод:
00:00:00.2031259

примерно так
...
Рейтинг: 0 / 0
01.03.2015, 14:01
    #38891703
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Дмитрий77
Код: vbnet
1.
(Now - std)


ужоснах

https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
...
Рейтинг: 0 / 0
01.03.2015, 15:31
    #38891741
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Изопропил,

нахненах, я попробовал и никакой практической или точностной разницы не вижу, кроме того что для stopwatch надо писать 4 строчки кода вместо двух.

Если интересно, то в VB6 (там нету таких штатных прибамбасов и с разницей двух Now() миллисекунды не получишь) я оценку делаю так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Option Explicit

Public Declare Function a2ku_apigettime Lib "winmm.dll" _
 Alias "timeGetTime" () As Long

Public Ingstartingtime As Long

Public Sub a2kuStartClock()
  Ingstartingtime = a2ku_apigettime()
End Sub

Public Function a2kuEndClock() As Long
  a2kuEndClock = a2ku_apigettime() - Ingstartingtime
End Function



В любом случае, доли миллисекунд мне нахненужны, и эти оценки делаются не на отдельно взятой операции а на интегрированном количестве однообразных операций типа "чтение 10000 записей из БД", "чтение 100 записей из реестра", потому как "время исполнения" небольшого к-ва операций по любому хаотически скачет, а на большом к-ве разница заметна и оценка более достоверна.
...
Рейтинг: 0 / 0
01.03.2015, 15:34
    #38891743
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
ИзопропилДмитрий77
Код: vbnet
1.
(Now - std)


ужоснах

https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Композитума напомнил...
:-)
Энергия точно та же.
...
Рейтинг: 0 / 0
01.03.2015, 15:50
    #38891751
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Дмитрий77"чтение 10000 записей из БД", "чтение 100 записей из реестра"
полагаешь, что извлечение первой происходит за 1/10000 (1/100) от общего времени ?
...
Рейтинг: 0 / 0
01.03.2015, 16:10
    #38891758
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Изопропил,

не полагаю. Но полагаю что 2100мс вместо 600мс на извлечение всех заставляет задуматься об оптимизации кода который их извлекает.

Я эту тему дернул из-за Try/Catch, т.е. при запуске недописанного проекта при чтении значений реестра когда у меня 40 раз сработал Catch, мне показалось что Debug "слишом долго" пишет сообщения про исключения.
И ту же самую фигню я наблюдал когда при сортировке ListView я проверял IsDate через Try/Cach (глядя на какой-то тупой пример из net-msdn) а один столбец был целиком DbNull.

Т.е. мой вывод, что использовать Try/Catch для проверки чего либо - это последнее дело. Так?
Не, м.б. я не прав и это дебаг гад так много времени тратит на то чтоб написать "Возникло исключение..."
Но мне кажется, что тормозит сам механизм Try/Catch если им злоупотреблять.
...
Рейтинг: 0 / 0
01.03.2015, 16:24
    #38891764
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
Дмитрий77Т.е. мой вывод, что использовать Try/Catch для проверки чего либо - это последнее дело. Так?

Я думаю, что да.
Когда у меня есть возможность - я стираю обработку эксепшенов, и разруливаю ситуацию проверкой условий.
Применяю однозначно только тогда, когда есть обращение наружу - к сервису или в базу данных...

Но вообще, есть даже такой модный дизайн - управление бизнес логикой по исключениям...
...
Рейтинг: 0 / 0
01.03.2015, 17:11
    #38891780
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение .Net примитивом из реестра - не возвращает дефолт.
D129,

именно так,
здесь разногласий нет
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение .Net примитивом из реестра - не возвращает дефолт. / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]