C# using statement application scope - c#

I have a question about the using statement for multiple files at once.
I have created an overload for a class that I want to use in my program.
To do so in one of my files I have added the following using statement.
using ClassName = CustomClassName;
This works, but only for that particular file.
Is there a way to get this to work for my entire project?

No.
using directives are per file.
You can always create a template that includes it.

No; C# does not have any such feature.

This is called type aliasing, re-utilizing the using keyword may be confusing, but it is not an import.
The purpose of this statement is to make a certain class accessible via a different name. This is useful in cases when you have different assemblies linked to your project which accidentally have classes with the same name.
If you for instance have A.dll that defines class Foo under the A namespace, and a B.dll assembly that also defines a Foo class under the B namespace, you can use:
using FooA = A.Foo;
using FooB = B.Foo;
to make distinctions between both.
The scope of this is usually the current file, although, if you happen to define multiple namespaces in the same file, you can scope that to the namespace within the file:
using FooA = A.Foo;
namespace N1
{
// knows about FooA;
using FooB = B.Foo;
}
namespace N2
{
// knows about FooA
// does not know about FooB
}
Practically you can make this aliasing more defined but no broader than the file's scope.

A simple solution for this is to create a template and use it into you project or class. this will give you a way to use the desire usings and directive as you wish.
here is a good sample to create a template .
http://www.rhyous.com/2010/02/17/how-to-modify-the-default-new-class-template-in-visual-studio-2008/
http://visualstudiomagazine.com/articles/2008/09/01/define-your-own-item-templates.aspx

Related

Is it possible to be using a library in a method but not outside the method?

For example:
private void MethodName()
{
Using System.OI;
}
I only need this library in this one method. Is there any way I can do this?
The reason I don't have it up top is the it creates ambiguous references.
There is no need at all to use a using statement when using a given type. You can simply use the fully qualified name when you want to use the type:
var lines = System.IO.File.ReadLines("temp.txt");
The using statement is merely syntactic sugar to avoid needing to do this for every single use of a type.
Use partial classes. Create two source files for the same class, one that imports System.IO (and contains your special method) and one that doesn't (and contains all the remaining methods).
using System.IO;
public partial class MyClass
{
private void MethodName()
{
...
}
}
This line from MSDN makes me suspect not:
The scope of a using directive is limited to the file in which it appears.
Note that it doesn't say scope. However, you can always reference an object without a using directive:
public void MyMethod()
{
System.IO.StreamWriter myWriter;
}
The partial class idea is another clever way around the problem. Here's the documentation I reference: MSDN
While most answers here about avoiding using statement and full qualified type name, I want to comment on this one:
I only need this library in this one method. Is there any way I can do this?
In .Net, adding using or adding reference to a library doesn't mean that this library will be loaded at all. Library is being loaded to application domain in runtime only then it is really used.
So adding using to a file don't hurt anyone; executing particular method will load necessary libraries if required.
Once library is loaded in application domain - it will never be unloaded.
So most probably - you won't need what you are asking for, just use using on file level or namespace aliases in case of names conflicts.

calling a project with using or project name

Is it better to use a class of another C# project by its class name. Like this
Buss_Logic.Class1 myClass1 = new Buss_Logic.Class1();
Buss_Logic.Class2 myClass2 = new Buss_Logic.Class2();
OR by using keyword on top of the file
using Buss_Logic;
As long as there is no namespace collision, it makes for more compact / easier to read code to include namespaces with the using keyword.
If there is ever any doubt as to where the class is defined, hover the mouse over the class name. The tool tip will show the fully qualified class name.
Use explicit namespaces if there is a namespace conflict (e.g. two classes called File in two different namespaces, where both classes are needed in the current source document).
Use a using at the top of the file as long as there are no conflicts in the names.
Given that the class themselves are clear enough, it makes the code easier to read.

C# Namespace issue

I am new to C# and I wish to know how to use my own namespace in c#.
Suppose I have a namespace MyNamespace1.
And I have another namespace MyNamespace2. I want to use MyNamespace1. But when I use
using MyNamespace1;
it is not recognizable.I want to know how to do this.
MSDN is your friend in learning about this.
The namespace keyword is used to declare a scope.
namespaces used to organize it's many classes
namespace N1 // N1
{
class C1 // N1.C1
{
class C2 // N1.C1.C2
{
}
}
namespace N2 // N1.N2
{
class C2 // N1.N2.C2
{
}
}
}
Using Namespaces (C# Programming Guide)
Check your accessibility level of your namespace. If it is in same project then you can access it directly.
using YourProjectName.NamespaceThatYouCreated;
If it is another project like dll etc then add reference to that library or project.
access namespace as:
using AnotherProject.CreatedNameSpacename;
http://msdn.microsoft.com/en-us/library/z2kcy19k%28v=vs.80%29.aspx
and this one in particular:
http://www.csharp-station.com/Tutorials/Lesson06.aspx
Also, what I've discovered, if you're using asp.net you might need to change the property "Build action" of the class you wish to use in your page to "Compile".
If both of your name spaces are in different project then you must add the reference of the other project to access it's namespace. In your case add the project reference of MyNamespace1 to the project the project of MyNamespace2.

C# Project & Namespaces Question

I am creating a little Math library for myself contained within a single project and am running into some issues with namespaces. I have the project MyMathLib and the top level namespace:
namespace MyMathLib
{ ... }
and in a separate file...
namespace MyMathLib.Addition
{ ... }
and...
namespace MyMathLib.Subtraction
{ ... }
In the MyMathLib.Subtraction namespace I have a method that needs to use a static method SomeClass.Work() defined in MyMathLib.Addition so I included using MyMathLib.Addition at the beginning of the Subtraction file. But when I try to use the method it would like me to first qualify it with Addition.SomeClass.Work() and I want to be able to just type SomeClass.Work(). What am I doing wrong?
Thanks!
EDIT
Thanks for the suggestions! In each file, I actually named the class after the namespace (i.e. in the namespace MyMathLib.Addition is a static class Addition and in MyMathLib.Subtraction there is a static class Subtraction). Apparently this is what caused the issue (looking back, I should have stated this instead of using SomeClass). If I change the namespace to MyMathLib.MyAddition while keeping the static class as Addition, the using MyMathLib.MyAddition works as I want; that is, I can now just type Addition.Work() in my static Subtraction class. I've seen classes named the same as it's containing namespace before, could someone maybe explain why this is causing an issue? Shouldn't the compiler be able to determine whether I want to use the namespace or the class from the context of the code?
I'm guessing that you either have two classes called SomeClass that are both in namespaces you reference, or you have a variable or property named SomeClass. Either of these situations would make it impossible for the compiler to know that you're trying to call the static MyMathLib.Addition.SomeClass.Work() method, but the specific solution the compiler is suggesting makes it seem more likely to be the former.
Update
Seeing your edit, that makes sense. If you were using these in a namespace outside of MyMathLib, then you would still be able to avoid this namespace conflict. However, because you are inside the MyMathLib.Subtraction namespace, the compiler will implicitly consider any portion of the namespace "above" you to take precedence over class names. In this case, when you say "Addition", the compiler will look for the following items to resolve the name:
A class explicitly identified by a using ... = ... directive.
MyMathLib.Subtraction.Addition namespace.
MyMathLib.Addition namespace.
Addition namespace.
Any classes in the namespaces identified by using statements.
In this case, you're hitting #3 before #4, so you should be able to work around it either by renaming the class or namespace, or by using Yahia's suggestion (#1):
using Addition = MyMathLib.Addition.Addition;
Update 2
After looking at the article you linked to, it sounds like the explicit using statement still won't work. I guess item #1 actually gets evaluated down around item #4 instead. Bummer. You can use an alias to give the class a different name locally:
using Add = MyMathLib.Addition.Addition;
...
var add = new Add();
But the best solution is still probably just to avoid the namespace collision entirely by changing your namespace or class name.
try putting additionally the floowing line into your substraction source
using SomeClass = Addition.SomeClass;
http://msdn.microsoft.com/en-us/library/dfb3cx8s.aspx
http://www.blackwasp.co.uk/NamespaceAliasQualifier.aspx
Sounds like you're in the Subtraction namespace...add this to the top, inside the namespace declaration:
using Addition;
That should do the trick.

How to assign same class object declared in 2 different namespaces

I have a webservice project with a class (let's refer to it as webservice.classA).
I have another class project producing a dll which references that class in its own namespace and instantiates an instance of it (lets call the dlls namespace dllnamespace).
In another project I want to access the member in the dll
e.g.
using webservice;
namespace other_project
{
class B
{
classA copy = null;
//....
dllnamespace.dostuff(); // amongst other things instantiates a classA object
//....
copy = dllnamespace.getclassA(); // method to return classA member
The compiler error I get is cannot convert type from dllnamespace.webservice.classA to other_project.webservice.classA
I guess I have a fundamental design flaw but I figure there must be (?) a way to declare/use "webservice.classA" in more than one namespace.
You have a name clash. The supported way of avoiding this (short of not naming your classes the same), is to define a using alias for one of the classes:
using webservice.classA = myWebserviceClassA;
You are right...the design flaw does exist in terms of naming.
Let us assume:
you have a class named
MyClass
the class exists both in namespace- abc.xyz.qwe.tyu.MyClass
and in namespace - sed.qwe.dfg.ert.MyClass
The workaround is -
using NS1 = abc.xyz.qwe.tyu.MyClass;
using NS2 = sed.qwe.dfg.ert.MyClass;
This way you avoid the clash.
Also, helpful to use if you have very long namespaces.
FURTHER REFERENCE : (From MSDN article on using Directive )
The scope of a using directive is
limited to the file in which it
appears.
Create a using alias to make it easier to qualify an identifier to a
namespace or type.
Create a using directive to use the types in a namespace without having to specify the namespace. A using directive does not give you access to any namespaces that are nested in the namespace you specify.
Change the copy definition line to:
dllnamespace.webservice.classA copy = null;
That's just the problem - you cannot have a class in more than one namespace. This is what namespaces were designed for - to prevent classes with the same name written by different people from aliasing. You'll need to decide for one of your namespaces to own that class and in the other one to import it. Alternatively if the dll and the web service are part of the same distributed app then they should use the same namespace.

Categories

Resources