Привет !
Сразу извиняюсь за возможную кривизну кода или вопроса, с Нет всего неделю.
Пытаюсь перетащить код с 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)
Иванов Виктор
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 не был проинициализирован.
Здравствуйте, Mab!
Большое спасибо за расъяснения, действительно я ступил
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 >>
Здравствуйте, mihailik, Вы писали:
M>Ну, то есть двойные логические операторы соответствуют естественному человеческому языку, а одинарные могут привести к недоразумениям. Угу?
Угу

Просто в Дельфи для этого была опция компилятора
Complete Boolean Eval, которую никто никогда не включал
Все таки с Delphi8 пока успехи по-лучше...
ОК, спасибо за разъяснение