ich bin seit an paar Tagen am grübeln. Mir ist da nämlich etwas seltsames, wie mir scheint, passiert. Ich poste vorweg einfach mal den Quell-Code (sorry wenn's bissl viel sein sollte).
Dies der Quellcode aus der Controller.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using EproxModell; namespace EproxController { public enum DataSourceType { None = 0, PDB = 10, ACC = 20, SQL = 30 } [Serializable] public class ProgramOptions { readonly bool isInitiated; public bool IsInitiated { get { return isInitiated; }} DataSourceType dataSourceType = DataSourceType.None; public DataSourceType DataSourceType { get { return dataSourceType; } set { dataSourceType = value; } } string pathToSqlServer = string.Empty; public string PathToSqlServer { get { return pathToSqlServer; }} string fileName = string.Empty; public string FileName { get { return fileName; }} string userName = string.Empty; public string UserName { get { return userName; }} string passWord = string.Empty; public string PassWord { get { return passWord; }} private ProgramOptions() { } public ProgramOptions(DataSourceType _dataSourceType, string _fileName = "") { this.dataSourceType = _dataSourceType; this.fileName = _fileName; this.isInitiated = true; } } public class CEproxController { #region Singleton-Instanz private static volatile CEproxController instance; private static object syncRoot = new Object(); public ProgramOptions programOptions; public bool HasConfig { get; set; } public static CEproxController Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) { instance = new CEproxController(); } } } // return instance; } } #endregion DataSetEproxModel ds; private CEproxController() { ds = new DataSetEproxModel(); Persistent.ReadOptions(ref this.programOptions); this.HasConfig = true; //Persistent.CreateDefaultOptionsFile(); } } }
Und hier der Code der Persistent.cs
using System; using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace EproxController { static class Persistent { public static void ReadOptions(ref ProgramOptions _programOptions) { FileStream fs = new FileStream("options.ini", FileMode.OpenOrCreate, FileAccess.ReadWrite); BinaryFormatter bf = new BinaryFormatter(); try { _programOptions = (ProgramOptions)bf.Deserialize(fs); } catch (Exception) { throw; } finally { fs.Flush(); fs.Close(); } } public static void CreateDefaultOptionsFile() { } } }
Beide Quellcodes sind im selben Projekt. Ich habe halt nur zwei Dateien angelegt um die eigentlichen Funktionen der Controller-Klasse frei von Dateioperationen zu halten.
So, nun zu dem Seltsame. Von dem ich sprach es wäre mir passiert.
Wenn ich im Konstruktor der Controller-Klasse die Methode ReadOptions der Klasse Persistent aufrufe passiert fogendes (oder sollte):
Die Referenz programOptions, die ich an die Methode ReadOptions in Persistent übergebe, wird wegen des ref-Schlüsselwort als Referenz übergeben. Sozusagen wird eine Referenz auf jene Referenz(Variable?) übergeben, die ein Objekt vom Typ ProgramOptions referenziert bzw. referenzieren kann. Denn, so mein Wissensstand, wenn die Variable nur deklariert wird, dann zeigt sie auf nichts/kein Objekt. Sondern ist erstmal nur sowas wie ein Zeiger, der auf nichts (NULL) oder ein entsprechendes Objekt (ProgramOptions in diesem Fall) zeigt/zeigen kann.
Weiterhin glaube ich gelernt zu haben dass Objekt-Referenzen, wie in diesem fall programOptions (vom Typ ProgramOptions), wenn sie denn an Methoden übergeben werden als Referenz übergeben werden. Als Referenz, die auf ein entsprechendes erzeugtes Objekt zeigt.
Sollte die Zuweisung eines (deserialisierten) Objekt an eine entsprechende Referenz der aufrufenden Klasse dann nicht auch ohne das ref-Schlüsselwort möglich sein?
Oder, um es kurz zu machen: Warum funktioniert mein Code nicht, wenn ich das ref-Schlüsselwort in der Methode ReadOptions und im entsprechenden Methodenaufruf weglasse?
Es funktioniert da zwar auch was... innerhalb der ReadOptions-Methode ist die Variable _programOptions nach der Zuweisung des deserialisierten Objekts mit entsprechenden Daten gefüllt. Wenn der Code allerdings in der Controller-Klasse zurück ist, dann ist die dort im Methodenaufruf übergebe Veriable == NULL.
Aber das entspricht, so irgendwie, gar nicht meinem Verständnis vom handling von Objekt-Variablen. Meiner Meinung nach sollte das auch ohne ref-Schlüsselwort laufen.
Was überseh ich?
Gruß
Joey
Dieser Beitrag wurde von nobido bearbeitet: 17. Februar 2013 - 06:24