|
Create a class with static variables maybe... I dont think global variables are possible in C#.
I rated this article 2 by mistake. It deserves more. I wanted to get to the second page... - vjedlicka 3:33 25 Nov '02
|
|
|
|
|
Try something like this:
<br />
namespace MyGlobals<br />
{<br />
sealed public class DaysOfTheWeek<br />
{<br />
public static int nSunday = 0; <br />
public static int nMonday = 1;<br />
public static int nTuesday = 2;<br />
public static int nWednesday = 3;<br />
public static int nThursday = 4;<br />
public static int nFriday = 5;<br />
public static int nSaturday = 6; <br />
}<br />
}<br />
You can reference these variables by name (nMonday, nFriday, etc.) in your other files after adding the following line:
<br />
using MyGlobals.DaysOfTheWeek;<br />
Click here to see my articles and software tools
|
|
|
|
|
You could create an abstract super class that defines the variables that need to be global, then derive all of your classes from that one class.
Alternatively, If you don't need to update the value of the variable, then you could define it in a .config file, and then read the config file from the classes that need to access the variable. If you need to change it or share it between application types (web, windows, windows services, etc.), then define an XML document somewhere on your system and then read from and update it in the classes where you use it.
I'm sure there is probably a better way to do it, but this is my 2c.
RabidK
|
|
|
|
|
Vitaliy Vorontsov wrote:
My application requires global variables
BTW the politically correct name for a global variable is "Well Known Object"
|
|
|
|
|
Robert Hinrichs wrote:
BTW the politically correct name for a global variable is "Well Known Object"
Well said. And there are no global functions either, only statics, which preserve the purity of the OO paradigm.
Cheers
|
|
|
|
|
try http://www.dofactory.com/patterns/PatternSingleton.aspx
It helps with global variables.
|
|
|
|
|
Perhaps this should be in the general .NET forum, but what the heck.
I've written a program, in C#, that runs as a service. I have done the installer so it will install the service on the system.
However what I cannot figure out (and probably because paying for all this Microsoft software made me so broke I cannot afford the approriate book) is how to handle the case where the service is already installed when setup is being run.
The installer will just say "Service is already installed" and rollback the entire installation. What I want to achive is that the executable for the service is updated and the service restarted.
I figured maybe I could do a check to see if the service was installed, stop it and then delete it, before the installer installs the new version,but I can't seem to find a method to actually remove a service from the system either.
Any pointers would be highly appreciated.
/CMH
|
|
|
|
|
|
Hi!
I am quite new to C# and have noticed that one cannot give default values to arguments. Any idea why this is not implementend in C#?
Best regards,
Alexandru Savescu
P.S. Interested in art? Visit this!
|
|
|
|
|
Alexandru Savescu wrote:
Any idea why this is not implementend in C#?
As I've read, this leads to versioning problems. Where does the default is defined? On the client or in the interface implementation?
It's not the fall that kills you: it's the sudden stop - Down by Law, Jim Jamursch (1986)
|
|
|
|
|
I think I was not clear enough. I meant default argument values to functions like in C++:
void f (int x = 0)
{
printf ("%d", x);
}
Best regards,
Alexandru Savescu
P.S. Interested in art? Visit this!
|
|
|
|
|
Alexandru Savescu wrote:
I think I was not clear enough.
No, you were. I wasn't, sorry.
This page explains it better than me:
"
Because IL always calls a method passing a complete set of arguments, the value of an absent argument is determined at compile time, not at run time. This has versioning consequences. For example, say a ComponentAssembly.dll assembly contains a method that has an optional Int32 argument whose default value is 5. Now imagine an AppAssembly.exe assembly that contains a call to this method and the optional argument isn’t specified. When compiling AppAssembly.exe, the compiler emits IL code that passes 5 to the method. Let’s say that the method in ComponentAssembly.dll has its optional parameter’s default value changed to 123 and the assembly is rebuilt. If the AppAssembly.exe assembly isn’t rebuilt, then at run time, 5 is passed to the method—the new default value (123) isn’t passed to the method unless the code in AppAssembly.exe is also recompiled.
"
http://www.microsoft.com/mspress/books/sampchap/6199e.asp[^]
It's not the fall that kills you: it's the sudden stop - Down by Law, Jim Jamursch (1986)
|
|
|
|
|
Thanks, that clarifies it.
Best regards,
Alexandru Savescu
P.S. Interested in art? Visit this!
|
|
|
|
|
One way to get around this issue would be for the c# compiler to auto-generate the necesary method overloads for optional params.
for instance:
public void Foo(Int32 i = 5){...}
would get compiled to:
public void Foo(Int32 i) {...}
public void Foo() { Foo(5); }
This would allow the value of the optional paramter to be stored in the correct assembly for versioning issues.
It's not a perfect solution, but it works pretty well.
|
|
|
|
|
Andy Smith wrote:
public void Foo(Int32 i) {...}
public void Foo() { Foo(5); }
This would allow the value of the optional paramter to be stored in the correct assembly for versioning issues.
Nice idea.
-Nick Parker
|
|
|
|
|
Can anyone point out me where i am wrong. The below code creates a user defined parameter object for a Command object in ADO.NET. I am just trying to type cast this parameter object with OracleParameter but i am getting invalid casting error.
Your help in this regard is highly appreciated.
Cheers
Venkat
using System;
using System.Data;
namespace venkat
{
///
/// This class is used to store the parameter information for a
/// command or a stored procedure.
///
public sealed class SPParameter: MarshalByRefObject,IDbDataParameter, IDataParameter, ICloneable
{
#region Private fields
private int m_DataType;
private DbType m_dbType;
private ParameterDirection m_Direction;
private bool m_blnIsNullable;
private string m_strParamName;
private string m_strSourceColumn;
private DataRowVersion m_oDataRowVersion;
private object m_oValue;
private byte m_bytePrecision;
private byte m_byteScale;
private int m_intSize;
#endregion
#region Public Attributes/properties
public int DataType
{
get{
return m_DataType;
}
set
{
m_DataType = value;
}
}
public DbType DbType
{
get{return m_dbType;}
set{m_dbType = value;}
}
public ParameterDirection Direction
{
get{return m_Direction;}
set{m_Direction = value;}
}
public bool IsNullable
{
get{return m_blnIsNullable;}
set{m_blnIsNullable = value;}
}
public string ParameterName
{
get{return m_strParamName;}
set{m_strParamName = value;}
}
public string SourceColumn
{
get{return m_strSourceColumn;}
set{m_strSourceColumn = value;}
}
public DataRowVersion SourceVersion
{
get{return m_oDataRowVersion;}
set{m_oDataRowVersion = value;}
}
public object Value
{
get{return m_oValue;}
set{m_oValue = value;}
}
public int Size
{
get{return m_intSize;}
set{m_intSize = value;}
}
public byte Precision
{
get{return m_bytePrecision;}
set{m_bytePrecision = value;}
}
public byte Scale {
get{return m_byteScale;}
set{m_byteScale= value;}
}
#endregion
#region Public member
public object Clone()
{
return this;
}
#endregion
///
/// Default constructor. Initialize member variables to default value.
///
public SPParameter()
{
this.m_blnIsNullable = false;
this.m_oValue = null;
this.m_strParamName = null;
this.m_strSourceColumn = null;
}
}
}
Cheers,
Venkatraman Kalyanam
Chennai - India
"Being Excellent is not a skill, it is an attitude"
|
|
|
|
|
You can only cast to supertypes iow, base classes and inferfaces. [edit]if you do not define others[edit]
I rated this article 2 by mistake. It deserves more. I wanted to get to the second page... - vjedlicka 3:33 25 Nov '02
|
|
|
|
|
Hello,
Please someone explain to me which is the need of Sychronized and SyncRoot in .NET collections. Why and how should I use this two features. Aren't the collections thread safe?? And if them aren't, a lock is not enough? Really, I think I have a big missunderstood about collections, please help.
Thanks,
Miguel
|
|
|
|
|
I'm not expert here, but here is my understanding.
I believe most of the collections have the SyncRoot element, and when you are locking the collections you need to lock the SyncRoot element.
So if you are locking a hastable, it should look something like
lock(myhashtable.SyncRoot).
The locking keyword in c# is a bit misleading, actually what it does is grant you access to the lock, so that no other thread can acquire the lock until you release it.
regards
Kannan
|
|
|
|
|
Don Miguel wrote:
which is the need of Sychronized
Synchronized tells you if the collection's operations will be thread-safe. Generally this is done by implementing a wrapper around the collection, using a lock on the SyncRoot for each operation performed.
Don Miguel wrote:
which is the need of SyncRoot
SyncRoot is for doing your own locking. Say you need to add a lot of items to the collection, during which no other thread should use it. Rather than using the Synchronized wrapper which would lock/unlock for each operation you would create a lock on the SyncRoot object, then perform each of your operations.
Don Miguel wrote:
Aren't the collections thread safe??
No, you need to refer to the documentation for each class you wish to use to find out if the operations are thread-safe. Making everything thread-safe by default is expense CPU wise, so you are better off not putting it in for the cases where thread-safety isn't an issue.
Most collection classes expose some way of getting a Synchronized version, usually by a static method of some sort. Always check the documentation to be sure.
James
"It is self repeating, of unknown pattern"
Data - Star Trek: The Next Generation
|
|
|
|
|
Many thanks James!
You was very explicit, it helps me much.
Don Migule
|
|
|
|
|
Hello,
How do I share data in my DLL with with other DLLs?
Chito
|
|
|
|
|
I think I have come across a fairly common situation but I cant find any help with this.
I have a simple form with 2 controls. A text box (Employee's Name) and a combo box (Employee's Job Title). I have a DataTable that I have tied both the text box and combo box to. Changing positions using the CurrencyManager works fine and everything is good.
But now I want to populate the combo-box with a list of all available jobs. I want to be able to select a item from the list and have it update the appropriate row in my DataTable as would an edit within the text box.
I have the following code, but I get un-expected results.
<br />
DataTable jobs = new DataTable("Jobs");<br />
jobs.Columns.Add("Job", typeof(string));<br />
jobs.Rows.Add(new object[] {"Software Engineer"});<br />
jobs.Rows.Add(new object[] {"Project Manager"});<br />
jobs.Rows.Add(new object[] {"Tester"});<br />
jobs.Rows.Add(new object[] {"Documenter"});<br />
jobs.Rows.Add(new object[] {"Project Lead"});<br />
<br />
cboJob.DataSource = t;<br />
cboJob.DisplayMember = "Job";<br />
<br />
DataTable namesAndJobs = new DataTable("NamesAndJobs");<br />
namesAndJobs.Columns.Add("Name", typeof(string));<br />
namesAndJobs.Columns.Add("Job", typeof(string));<br />
<br />
namesAndJobs.Rows.Add(new object[] {"Bob", "Project Lead"});<br />
namesAndJobs.Rows.Add(new object[] {"Mark", "Documenter"});<br />
namesAndJobs.Rows.Add(new object[] {"Henry", "Project Manager"});<br />
<br />
txtName.DataBindings.Add("Text", namesAndJobs, "Name");<br />
cboJob.DataBindings.Add("Text", namesAndJobs, "Job");<br />
Can what I want to do, even be done? If not, what is the purpose of allowing multiple DataBindings to the same control?
"I am so smart. S-M-R-T. I mean, S-M-A-R-T" - Homer
|
|
|
|
|
I was wondering how I would center the form when it loads? In VC++ and VB I believe there is a setting to center the form. But I don't see it in the properties. So the other way I was planning on doing this was to do something similar to
Form.Left = (Screen_Width+Form_Width/2)
for the width and height, but for that I need to know how to get the screen width.
Any help on either method or another one will be much appreciated.
|
|
|
|
|
I found it.
// Center the Form on the user's screen everytime it requires a Layout.
this.SetBounds((Screen.GetBounds(this).Width/2) - (this.Width/2),
(Screen.GetBounds(this).Height/2) - (this.Height/2),
this.Width, this.Height, BoundsSpecified.Location);
|
|
|
|