Обнуление поля класса
От: IvanovVK Россия  
Дата: 22.02.04 11:18
Оценка:
Привет !
Сразу извиняюсь за возможную кривизну кода или вопроса, с Нет всего неделю.
Пытаюсь перетащить код с Delphi в C#.

public class MRegistry 
    {
    public FileStream FStream;
        private TDataRec FRootData;
        
        public void ReadRegistry(string ARegFile)
        {
            uint  dwLoc=0;
            FileStream FStream = new FileStream(ARegFile, FileMode.Open);
            BinaryReader br = new BinaryReader(FStream/*, System.Text.ASCIIEncoding*/) ;
            FStream.Seek(12, SeekOrigin.Begin);
            dwLoc = br.ReadUInt32();
                             FRootData = CreateData(dwLoc,0,null);
         }

        public TDataRec CreateData(uint dwLoc, uint dwOwner, TDataRec drParent)
        {
            TDataRec Result =null;
            if ((dwLoc<13) | (dwLoc>= (ulong)(this.FStream.Length - 52)))
                 return Result;
            TRegEntry RegEntry = new TRegEntry();


Там дальше еще код идет, но у меня косяк уже на проверке
 if ((dwLoc<13) | (dwLoc>= (ulong)(this.FStream.Length - 52)))

потому что FStream тут уже = null. Я так понимаю, сборщик решил,
что FStream больше никому не нужен.
Подскажите плиз, как решить данную проблему, кроме как передав
FStream в CreateData(uint dwLoc, uint dwOwner, TDataRec drParent, FileStream FStream)

Иванов Виктор
--
best regards,
vic
Re: Обнуление поля класса
От: Mab Россия http://shade.msu.ru/~mab
Дата: 22.02.04 12:29
Оценка:
IVK>public class MRegistry 
IVK>    {
IVK>    public FileStream FStream;

Здесь объявлено поле MRegistry.FStream.

IVK>        public void ReadRegistry(string ARegFile)
IVK>        {
IVK>...
IVK>            FileStream FStream = new FileStream(ARegFile, FileMode.Open);

А это уже локальная переменная FStream, к никаого отношения к MRegistry.FStream не имеющая.
Нужно сделать так:
FStream = new FileStream(ARegFile, FileMode.Open);


IVK> Я так понимаю, сборщик решил, что FStream больше никому не нужен.

Нет. MRegistry.FStream не был проинициализирован.
Re[2]: Обнуление поля класса
От: IvanovVK Россия  
Дата: 22.02.04 13:07
Оценка:
Здравствуйте, Mab!

Большое спасибо за расъяснения, действительно я ступил
--
best regards,
vic
Re: Обнуление поля класса
От: mihailik Украина  
Дата: 23.02.04 14:26
Оценка: +1
IVK>
IVK> if ((dwLoc<13) | (dwLoc>= (ulong)(this.FStream.Length - 52)))
IVK>


Логические операторы правильно пишутся удвоенными: "||", "&&". Если не удваивать, то в выражении всегда вычисляются все элементы. Пример:

if( myStr!=null && myStr.Length>0 )


Если здесь поставить одинарное "&", то иногда будет вылетать исключение. Потому, что FStream.Length можно вызывать только если FStream!=null. А с одинарным "&" второе выражение вычисляется безусловно и независимо от первого.

Ну, то есть двойные логические операторы соответствуют естественному человеческому языку, а одинарные могут привести к недоразумениям. Угу?
... << RSDN@Home 1.1.3 beta 1 >>
Re[2]: Обнуление поля класса
От: IvanovVK Россия  
Дата: 23.02.04 19:38
Оценка:
Здравствуйте, mihailik, Вы писали:

M>Ну, то есть двойные логические операторы соответствуют естественному человеческому языку, а одинарные могут привести к недоразумениям. Угу?


Угу Просто в Дельфи для этого была опция компилятора
Complete Boolean Eval, которую никто никогда не включал

Все таки с Delphi8 пока успехи по-лучше...

ОК, спасибо за разъяснение
--
best regards,
vic
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.