initialize constructor with new inside class in C# - c#

I'm new to C# programming. I want to know why this is not possible:
// In file1.cs
public class Test {
public int Rt() {
return 10;
}
}
// In file2.cs
public class Test2 {
// initialize constructor here, but return compile-error
Test k = new Test();
static void Main() {
Console.Write(k.Rt()); // error here
}
}
Additional: I am learning C# for unity, so I also want to know if above is not possible then why this is not an error in unity
public class PlayerScript: MonoBehaviour {
public Vector2 speed = new Vector2(25, 25); // Not an error
void Update() {
Debug.Log(speed); // works
}
}

You're trying to access an instance member inside a static method. That's not allowed. You can define k as static to make it work
static Test k = new Test();
I recommend you to take a look to Static Classes and Static Class Members to get more details
The static member is callable on a class even when no instance of the class has been created. The static member is always accessed by the class name, not the instance name. Only one copy of a static member exists, regardless of how many instances of the class are created. Static methods and properties cannot access non-static fields and events in their containing type, and they cannot access an instance variable of any object unless it is explicitly passed in a method parameter.

In addition to the other answers, another option is to make your Test class and Rt method static. Like so:
public class Program
{
public static void Main()
{
Console.Write(Test.Rt());
}
}
public static class Test {
public static int Rt() {
return 10;
}
}
You really don't have many cases to use a static class though they do exist. I would just move Test t = new Test(); inside your Main method.
public class Program
{
public static void Main()
{
Test t = new Test();
Console.Write(t.Rt());
}
}
public class Test {
public int Rt() {
return 10;
}
}

This is because your Main method is static but your Test2 class is not static. The k variable lives in an instance of Test2 but the Main method belongs to the type itself. If something is static, it means you can call it without instantiating a variable of that type:
Test2.Main();
If you attempted to instantiate a Test2 and call Main you'd get an error because it's static.
var test2 = new Test2();
test2.Main(); //ERROR
You can make k static for this to compile:
public class Test2 {
// initialize constructor here, but return compile-error
static Test k = new Test();
static void Main() {
Console.Write(k.Rt()); // error here
}
}
The second example you showed works fine because the Update method is not static, which means that the method lives with an instantiation of PlayerScript, unlike the Main method.

Related

Static Class vs Protected Constructor

I Am getting a warning message in my class, like
Add a Protected constructor or the static keyword to the class declaration
Solution
The error is gone after I tried both the below ways,
static class without constructor
public static class Program {
}
Non static class with protected using constructor
public class Program
{
protected Program() { }
}
Question:
So What is the difference between Static Class vs Protected Constructor which is mentioned in my above solution? And which one is best to use?
A static class doesn't need an instance to access its members. A static class cannot have instance members (e.g. public int MyNumber; is not allowed on a static class because only static members are allowed on a static class). Both instance and static members are allowed on a non-static class though. A class with a protected constructor can only have an instance created by itself or something that inherits from it.
public class Program
{
protected Program()
{
// Do something.
}
public static Program Create()
{
// 100% Allowed.
return new Program();
}
public void DoSomething()
{
}
}
public static class AnotherClass
{
public static Program CreateProgram()
{
// Not allowed since Program's constructor is protected.
return new Program();
}
}
public class SubProgram : Program
{
protected SubProgram()
{
// Calls Program() then SubProgram().
}
public new static Program Create()
{
// return new Program(); // We would need to move the SubProgram class INSIDE the Program class in order for this line to work.
return new SubProgram();
}
}
Program.Create(); // Can be called since Create is public and static function.
Program.DoSomething() // Can't be called because an instance has not been instantiated.
var test = Program.Create();
test.DoSomething(); // Can be called since there is now an instance of Program (i.e. 'test').
AnotherClass.CreateProgram(); // Can't be called since Program's constructor is protected.
SubProgram.Create(); // Can be called since SubProgram inherits from Program.
As for performance, this distinction doesn't really have much to do with performance.
You probably only have static members in the class and the code analyser assumes that your intention is to not be able to create instances of the class so it is asking you to either make the class static
public static class Program {
//...static members
}
or put a protected/private constructor
public class Program {
protected Program { //OR private
}
//...static members
}
to prevent instances of that class from being initialized.
A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated.
Reference Static Classes and Static Class Members (C# Programming Guide)
The protected constructor means that only derived classes can call the constructor
and a private constructor wont allow any other classes to initialize the class with a private constructor
A static constructor is called when the class type is instantiated. The protected constructor is called when an instance of a class is created. The protected part means only classes that inherit the class can call it.
Static Constructor: Called once when the class type is instantiated and is used to initialize static members. Does not create an instance of the class.
Protected Constructor: A constructor that can be called only by the class or a class that inherits it.
The best practices for this is that you should have a static constructor for initializing static members and a protected constructor if you only want classes that inherit to be able to create an instance of your class. You can have both.
public class MyClass
{
static readonly long _someStaticMember;
private bool _param;
static MyClass()
{
//Do Some Logic
_someStaticMember = SomeValueCalculated;
}
protected MyClass(bool param)
{
_param = param;
}
}
public class ChildClass: MyClass
{
public ChildClass(bool param) : base(param);
}
public class NotChildClass
{
public MyClass someObject = new MyClass(true); //Will Fail
}

Static Class VS Private Constructor

Today, I have been reading about static class and private constructor.
Static Class - We cannot create an instance on the static class. we cannot inherit the static class. Only single instance is generated.
Private Constructor - We cannot create an instance. We cannot inherit. (I Don't know about how many instance is generated.)
I created two console application i.e. One for static Class, One for Private constructor.
Static Class Code
I understood single object in generated as constructor is called once.
Private Constructor Code
Now, I didn't understand that whether any object is generated or not.
I have two question.
Question 1. I didn't find any particular difference between Private constructor and Static class. Can you please suggest me that in which scenario where I should use Private Constructor and where should I use Static class as I can use both of them.
Question 2. If I use private constructor, how many objects is generated?
Thanks.
EDIT :
I think that people didn't understand my question.
I know that static constructor always call once on the first reference. Static constructor is used to initialize static members of the class.
Question 1. I have a situation : I need to create a class which cannot be instantiated.I can do this by either static class or private constructor. So my question is that "Is there any difference between both of them? which one I should use??"
Question 2. If I use private constructor, how many object is created? If answer is 0 then how private constructor's memory allocation works in the CLR. There is no memory allocation if I use private constructor.
Both of you examples you are calling static methods the difference between the two is that the first method is being called within a static class which cannot be instantiated. The second class could be instantiated however you did not choose to.
The static constructor in the first example is run automatically at runtime when it is needed, it is generally only run once.
The private constructor is never run as you never instantiated a testPrivateConstructor object. not because it is private.
The Edit:
Q1: If you need a class that cannot be instantiated use a static class. Only use a private constructor instead of a static class if you need to initialise static members (or a singleton pattern).
Q2: If you use a private constructor you can instantiate an instance of your class within the class itself so the number of objects that are created depend on how many times you instantiate new objects.
your mixing up a few different things here
a static class public static class MyClass can only contain static elements and never be initialised
a constructor (whether public or private) always creates in instance of the class the public or private only says the visibility of the constructor.
this is commonly used when implementing a singleton design
private MyClass()
{
}
private static MyClass _Singleton;
public static MyClass Singleton
{
get
{
if(_Singleton==null) _Singleton = new MyClass();
return _Singleton
}
}
}
the other is a Class Initialiser, this is a little confusing because its syntax is very similar to a constructor baring the adding of a static keyword and lack of parameters
static MyClass()
{
//configure static variables on first us only
b = //read value from file or other resource not avalable at compile time
a = b.Lenth; //can't be be done in class body as b would not have been initialised yet
}
private static int a;
private static string b;
ergo if your class can't be instantiated then you can only declare is as static nothing else will do that,
if you call a private constructor then every call creates an instance
a class initialiser can never be called its fired automatically on the first use of a class and does not create an instance
EDIT:
here is a revised version of your test program
public static class StaticClassExample
{
public static void ClassFunction()
{
Console.WriteList("This is a class function")
}
}
public static class InitialisedStaticClassExample
{
static InitialisedStaticClassExample()
{
Console.WriteList("This class has been initialised")
}
public static void ClassFunction()
{
Console.WriteList("This is a class function")
}
}
public class PrivateConstuctorClassExample
{
static PrivateConstuctorClassExample()
{
Console.WriteList("This class has been initialised")
}
private PrivateConstuctorClassExample()
{
Console.WriteList("This class has been Instantiated")
}
public static void ClassFunction()
{
Console.WriteList("This is a class function");
var instance = new PrivateConstuctorClassExample();
instance.InstanceFunction();
}
public void InstanceFunction()
{
Console.WriteList("This is a instance function")
}
}
Static constructor will be called first time when the class is
referenced. Static constructor is used to initialize static members
of the class.
In the non static class the private or public constructor will not be
called. Static members will not be initialized either by private or
public constructor.
see the below exmaple
class Program
{
static void Main(string[] args)
{
OnlyOne.SetMyName("I m the only one."); //static constructor will be called first time when the class will be referenced.
Console.WriteLine(OnlyOne.GetMyName());
NoInstance.SetMyName("I have private constructor"); //No constructor will be called when the class will be referenced.
Console.WriteLine(NoInstance.GetMyName());
Console.Read();
}
}
static class OnlyOne
{
static string name;
/// <summary>
/// This will be called first time when even the class will be referenced.
/// </summary>
static OnlyOne()
{
name = string.Empty;
Console.WriteLine("Static constructor is called");
}
public static string GetMyName()
{
return name;
}
public static void SetMyName(string newName)
{
name = newName;
}
}
public class NoInstance
{
static string name;
private NoInstance()
{
name = string.Empty;
Console.WriteLine("No instance private constructor is called");
}
public static string GetMyName()
{
return name;
}
public static void SetMyName(string newName)
{
name = newName;
}
}
}
Question 2: 0
Question 1: you created a static class with a static constructor, but you do not need the instance in your case, since the method is static too and the only thing you need to run a static method is the class definition - no instance.
your second class works also without construction of an instance - the static method does not need one. and since this is a private constructor only class methods could create the instance.
you would use the private constructor only in case of the singleton pattern i guess - without a local caller for private constructor it is rather useless.
Constructor of a class is called upon creation of instance of the class.
Static constructors are called on initialization of the class. Read this
In example 1, your static constructor is initialized the as you are accessing a static method of the class. This is relevant for a static or non-static class.
In example 2, your private constructor isn't static.
Your constructor wasn't called as there was no instance created.
It has to be called by creating an instance of the class.
Private constructors are used to control the construction and destruction of the instance of the class.
Since, only the class can call its constructor in this case. You need a static method to get the instance of the class
For example,
public class TestPrivateConstructor
{
private TestPrivateConstructor()
{
Console.WriteLine("Instance is created, Private Constructor called");
}
static TestPrivateConstructor _instance;
public static TestPrivateConstructor GetInstance()
{
if(_instance == null)
{
_instance = new TestPrivateConstructor();
}
return _instance;
}
public static void DisposeInstance()
{
if(_instance !=null)
{
_instance.Dispose();
_instance = null;
}
}
public void TestMethod()
{
Console.WriteLine("Test MEthod Called");
}
void Dispose()
{
//Do something
}
}
For the code above, try using this. Now your private constructor is called as you created an instance.
class Program
{
public static void Main(string[] args)
{
//Private constructor
TestPrivateConstructor.GetInstance()
}
}
Using the approach above, you can control the construction and destruction of the object.
If you still have any questions, please feel free to ask.

Cannot access a non-static member of outer type via nested type

I have error
Cannot access a non-static member of outer type 'Project.Neuro' via
nested type 'Project.Neuro.Net'
with code like this (simplified):
class Neuro
{
public class Net
{
public void SomeMethod()
{
int x = OtherMethod(); // error is here
}
}
public int OtherMethod() // its outside Neuro.Net class
{
return 123;
}
}
I can move problematic method to Neuro.Net class, but I need this method outside.
Im kind of objective programming newbie.
Thanks in advance.
The problem is that nested classes are not derived classes, so the methods in the outer class are not inherited.
Some options are
Make the method static:
class Neuro
{
public class Net
{
public void SomeMethod()
{
int x = Neuro.OtherMethod();
}
}
public static int OtherMethod()
{
return 123;
}
}
Use inheritance instead of nesting classes:
public class Neuro // Neuro has to be public in order to have a public class inherit from it.
{
public static int OtherMethod()
{
return 123;
}
}
public class Net : Neuro
{
public void SomeMethod()
{
int x = OtherMethod();
}
}
Create an instance of Neuro:
class Neuro
{
public class Net
{
public void SomeMethod()
{
Neuro n = new Neuro();
int x = n.OtherMethod();
}
}
public int OtherMethod()
{
return 123;
}
}
you need to instantiate an object of type Neuro somewhere in your code and call OtherMethod on it, since OtherMethod is not a static method. Whether you create this object inside of SomeMethod, or pass it as an argument to it is up to you. Something like:
// somewhere in the code
var neuroObject = new Neuro();
// inside SomeMethod()
int x = neuroObject.OtherMethod();
alternatively, you can make OtherMethod static, which will allow you to call it from SomeMethod as you currently are.
Even though class is nested within another class, it is still not obvious which instance of outer class talks to which instance of inner class. I could create an instance of inner class and pass it to the another instance of outer class.
Therefore, you need specific instance to call this OtherMethod().
You can pass the instance on creation:
class Neuro
{
public class Net
{
private Neuro _parent;
public Net(Neuro parent)
{
_parent = parent;
}
public void SomeMethod()
{
_parent.OtherMethod();
}
}
public int OtherMethod()
{
return 123;
}
}
I think making an instance of outer class in inner class is not a good option because you may executing business logic on outer class constructor. Making static methods or properties is better option. If you insist making an instance of outer class than you should add another parameter to outer class contructor that not to execute business logic.

C# static class constructor

Is there a work around on how to create a constructor for static class?
I need some data to be loaded when the class is initialized but I need one and only one object.
C# has a static constructor for this purpose.
static class YourClass
{
static YourClass()
{
// perform initialization here
}
}
From MSDN:
A static constructor is used to initialize any static data, or to
perform a particular action that needs to be performed once only. It
is called automatically before the first instance is created or any
static members are referenced
MSDN link
.
A static constructor looks like this
static class Foo
{
static Foo()
{
// Static initialization code here
}
}
It is executed only once when the type is first used. All classes can have static constructors, not just static classes.
Yes, a static class can have static constructor, and the use of this constructor is initialization of static member.
static class Employee1
{
static int EmpNo;
static Employee1()
{
EmpNo = 10;
// perform initialization here
}
public static void Add()
{
}
public static void Add1()
{
}
}
and static constructor get called only once when you have access any type member of static class with class name Class1
Suppose you are accessing the first EmployeeName field then constructor get called this time, after that it will not get called, even if you will access same type member.
Employee1.EmployeeName = "kumod";
Employee1.Add();
Employee1.Add();
Static constructor called only the first instance of the class created.
like this:
static class YourClass
{
static YourClass()
{
//initialization
}
}
We can create static constructor
static class StaticParent
{
StaticParent()
{
//write your initialization code here
}
}
and it is always parameter less.
static class StaticParent
{
static int i =5;
static StaticParent(int i) //Gives error
{
//write your initialization code here
}
}
and it doesn't have the access modifier
You can use static constructor to initialization static variable. Static constructor will be entry point for your class
public class MyClass
{
static MyClass()
{
//write your initialization code here
}
}
Static classes cannot have instance constructors (unlike the accepted answer). However, a class can have a static constructor. That is totally different.

c# static constructor problem

The following code does not call the class static constructor. Is this a bug or feature?
class Test
{
static Test
{
//do stuff
}
public static AnotherClass ClassInstance { get; set; }
}
class Program
{
public static void Main()
{
var x = Test.ClassInstance;
}
}
I don't have a compiler right now, but this is what happened to me today. The static constructor is never called, but it is called when ClassInstance is a field instead.
EDIT:
I understand that static constructor is called when first instance is created or a field is accessed. Isn't there a field behind the automatic implemented property?
I am looking for some explanation on why the property does not trigger static constructor when property is implemented as two functions and one field. It is just very unlogical to me and that is why I thought it could be a bug.
Static constructors invoked the first time an instance of a class are created or when a static member is referenced. So the first time your create an instance of Test or when the ClassInstance property is referenced is when your static constructor will be called.
Would you like to know more? - http://msdn.microsoft.com/en-us/library/k9x6w0hc(VS.80).aspx
I verified the same behaviour, but if you change the code like this:
class AnotherClass {}
class Test
{
static Test()
{
Console.WriteLine("Hello, world!");
}
public static AnotherClass ClassInstance { get { return new AnotherClass(); } }
}
class Program
{
public static void Main()
{
var x = Test.ClassInstance;
}
}
it writes "Hello, world!"...
Static constructor is called when any static member is accessed or instance is created
class Program
{
static void Main(string[] args)
{
A.SomeField = new B();
}
}
class A
{
static A()
{
Console.WriteLine("Static A");
}
public static B SomeField { get; set; }
}
class B
{
static B()
{
Console.WriteLine("Static B");
}
}
Result:
Static B
Static A
As you see - there is no "Static B" in the result
the static constructor is called automatically before the first instance is created or any static members are referenced.
more information from Msdn.

Categories