|
This may be a stupid question, which may be easily solved if I just study the C# programming guide thoroughly, yet I expect help from Codeproject members as I don't have enough time.
I've a library with a class called RegistryBrowser, that simply encapsulates the Microsoft.Win32.Registry and Microsoft.Win32.RegistryKey classes to provide a simple stateful access mechanism to the windows registry. This is a code fraction from the class:
public class RegistryBrowser
{
RegistryKey currentKey, regRoot, tempKey;
bool writable;
string temp;
public string FullPath
{
get
{
return currentKey.Name;
}
}
public int SubKeyCount
{
get
{
return currentKey.SubKeyCount;
}
}
public int ValueCount
{
get
{
return currentKey.ValueCount;
}
}
public RegistryBrowser(RegistryKey root, bool writable)
{
regRoot = root;
currentKey = regRoot;
this.writable = writable;
}
public RegistryBrowser(RegistryKey root, string subKey, bool writable)
{
regRoot = root;
currentKey = regRoot.OpenSubKey(subKey, true);
this.writable = writable;
}
public bool BrowseTo(string subKey)
{
tempKey = currentKey;
currentKey = currentKey.OpenSubKey(subKey);
if (currentKey == null)
{
currentKey = tempKey;
return false;
}
else if(tempKey != regRoot)
tempKey.Close();
return true;
}
.
.
.
Now the problem is that both the constructors simply copy the object reference 'root'. What if the calling method calls the .Close method on the same instance. I need to secure my library against this. So how do I copy the object, instead of just copying the reference, or maybe I need a better design. If so, please suggest.
I encounter this problem very often and it's the source of most of bugs in my programs. Please suggest at the earliest.
modified on Friday, November 7, 2008 10:08 AM
|
|
|
|
|
|
ICloneable is generally not recommended[^].
It is ambiguous as to weather the call to clone will be a deep or shallow copy, so can introduce bugs if the caller makes the wrong assumptions. Recommendation is to define your own clone semantics and implement the required interfaces.
Simon
|
|
|
|
|
Ankit Rajpoot wrote: I just study the C# programming guide thoroughly, yet I expect help from Codeproject members as I don't have enough time.
You can expect all you like, does not mean you'll get. And with an attitude like that im certainly not helping.
|
|
|
|
|
I said that just to glorify the helping nature of Codeproject members. I'm not a professional programmer working for some company. I'm a student who also need to study the academic course. I program just for the sake of my hobby. So what I mean by not having enough time is that I don't have time to study the guide and read the concepts. If someone can (please) tell me some straightforward way of doing that, I'd be very grateful. And if my attitude was bad, I'd not have said 'please'.
|
|
|
|
|
You just started your post rather badly. You basically said that the problem was easy to solve and that if you could be bothered you would do it your self, but you can't be bothered so you expect someone here to do the work for you. If you can't be bothered to put the effort it, why should you expect someone else to do it for you.
I'm sure you didn't mean it like that, it was just worded badly.
Ankit Rajpoot wrote: I'm not a professional programmer working for some company
Remember that people here aren't professionals paid to answer questions, we just do it because we are being generous. Don't expect an answer quickly every time.
Looks like you've got some good answers to your question though. Personally, Dave's sounds like the best solution.
Simon
|
|
|
|
|
Thanks,
And I agree, I started my post rather badly. That was, may be because I'm not a native English speaker & so I've difficulties fluently understanding the emotions that a statement conveys. Another reason is that I wanted my post to be extra polite and for the sake of it, I wrote that "it's a stupid question and can be solved by reading the guide", because I just thought that it's not worth bothering the geniuses for.
|
|
|
|
|
Ankit Rajpoot wrote: Now the problem is that both the constructors simply copy the object reference 'root'. What if the calling method calls the .Close method on the same instance.
An object passed in is not copied. You only get a copy of the reference. Why don't you just create an internally used RegistryKey object, using the passed in object as a guide to the key to open??
|
|
|
|
|
Exactly my thought as well , like this...
static RegistryKey CopyKey(RegistryKey k, bool writeable)
{
string[] pathParts = k.Name.Split(new string[] { @"\" }, StringSplitOptions.None);
RegistryKey currentKey = null;
switch (pathParts[0].ToUpper())
{
case "HKEY_CLASSES_ROOT":
currentKey = Registry.ClassesRoot;
break;
case "HKEY_CURRENT_CONFIG":
currentKey = Registry.CurrentConfig;
break;
case "HKEY_CURRENT_USER":
currentKey = Registry.CurrentUser;
break;
case "HKEY_DYN_DATA":
currentKey = Registry.DynData;
break;
case "HKEY_LOCAL_MACHINE":
currentKey = Registry.LocalMachine;
break;
case "HKEY_PERFORMANCE_DATA":
currentKey = Registry.PerformanceData;
break;
case "HKEY_USERS":
currentKey = Registry.Users;
break;
}
if (pathParts.Length == 1)
return currentKey;
for (int pathPartIndex = 1; pathPartIndex < pathParts.Length; pathPartIndex++)
{
currentKey = currentKey.OpenSubKey(pathParts[pathPartIndex], writeable);
}
return currentKey;
}
Keep It Simple Stupid! (KISS)
|
|
|
|
|
Many thanks Ben
I didn't expect anyone to post the complete method.
Once again, many many many thanks, I'm really obliged.
|
|
|
|
|
My son would like to get into game programming. Are there any good C# game programming references that anyone can recommend? Thanks.
|
|
|
|
|
The thing to start with is XNA[^]. It's a dedicated gaming framework from MS. It's entirely .net based (no need to get dirty with directx), and there is a Visual Studio "XNA game studio" express edition available for free.
Check out the creators club[^] for guides and competitions and stuff. There's a bunch of getting started guides, tutorials and sample code under the "education" tab.
Simon
|
|
|
|
|
I suggest starting out with something like Gamemaker. That way you get an idea of how the logic flows and how things can be set up, before actually having to write the code yourself.
My current favourite word is: Nipple!
-SK Genius
Game Programming articles start - here[ ^]-
|
|
|
|
|
Hi there
How can I draw and image with a transparency and an alpha bending ?
many thx
|
|
|
|
|
It's done the same as any other image. Since you're asking this question, I take it your not getting the results you were hoping for?? You might want to explain what you're ultimately trying to do with this.
|
|
|
|
|
Before asking such question you could have searched the web. The first link I got from Google itself will answer you.
DrawTransparentImageUsingAB[^]
*jaans
|
|
|
|
|
I am working on an SDK. Obviously I am very happy with the ability to create documentation from code comments. This is useful for both Intellisense and Documentation. We are using Sandcastle to produce the chm file. Sandcastle allows me to filter out internal and private elements. Unfortunately they are in the XML generated by csc.exe which means they show up in Intellisense. I don't see anyway to filter the output of csc. Can I use Sandcastle to filter the docs? How do other people do this?
Tanks for your support
Pat O
<a href="http://currentchaos.blogspot.com/">Blog</a>
_ _ _
|
|
|
|
|
Don't write any.
Your classes should be small enough that you don't need to anyway. Just use regular comments.
|
|
|
|
|
Are you suggesting that I do not put comments on internal/private methods? I appreciate that methods should be apparent and "self documenting", but this is no help unless you are reading the code. I find the answer that I should just read the code (instead of relying on documentation) is not very practical.
Tanks for your support
Pat O
<a href="http://currentchaos.blogspot.com/">Blog</a>
_ _ _
|
|
|
|
|
That's why I added, "Just use regular comments."
|
|
|
|
|
I guess I did not make myself clear. We have "internal" developers and "external" developers. That is to say we have a team that is working on the SDK and then there are the SDK customers. I want Intelliscense and popup help for the internal developers, but not for external ones. So is there a way I can remove the comments for internal and private, that I can use for one configuration of the solution "retail" and leave in for other configurations ("debug" and "release").
BTW, at this point I assume the answer is no.
Tanks for your support
Pat O
<a href="http://currentchaos.blogspot.com/">Blog</a>
_ _ _
|
|
|
|
|
You could write your own tool that would skip the internal and private ones.
Oh, wait, intellisence won't show documentation for the parts they can't see anyway.
I thought you were asking about the generated XML file.
|
|
|
|
|
I was. Doesn't intelliscense use the XML?
Tanks for your support
Pat O
<a href="http://currentchaos.blogspot.com/">Blog</a>
_ _ _
|
|
|
|
|
Not the (optional) XML file generated during a build.
I wonder whether or not conditional compilation would help:
# if InternaldBuild
<summary>... </summary>
# endif
internal void F () ...
|
|
|
|
|
Hi,
I have a custom class which inherits from IComparable & it contains properties pertaining to Sales Orders.
I have added code to sort this SalesOrders class by the 'SalesOrderDueDate' as so:-
public int CompareTo(SalesAllocationOrderDetail other)
{
return SalesOrderDueDate.CompareTo(other.SalesOrderDueDate);
}
But I am struggling to find a good example on the web of how to do this sort on another date field as well.
Basically I need to sort this class <list> based on oldest SalesOrderDueDate & then OldestTransactionDueDate - in the same mannor as Excel would do this sort based on 2 columns!
If anyone can help me I would most appreciate it.
Thanks
Janet.
Lady Programmers are a rare breed!
|
|
|
|