2013-02-06 28 views
13

Tôi khá mới đối với C# và đã tạo một lớp mà tôi muốn sử dụng trong lớp chính của mình. Hai lớp học trong các tập tin khác nhau, nhưng khi tôi cố gắng nhập một vào khác với using, cmd nói nóiC# nhập lớp vào lớp khác không hoạt động

Loại hoặc namespace tên "MyClass" không thể được tìm thấy (là bạn thiếu một chỉ thị sử dụng hoặc ? tham khảo một hội

tôi biết rằng trong Java tôi phải mess xung quanh với CLASSPATH để có được những điều như thế này để làm việc, nhưng tôi không có ý tưởng về C#

chi tiết bổ sung:.

Như bạn có thể đã tìm ra, tôi đang biên dịch và thực hiện thông qua dấu nhắc lệnh. Tôi đang biên soạn lớp không chính của mình bằng cách sử dụng /target:library (Tôi nghe nói rằng chỉ có các lớp chính là .exe-files).

Mã của tôi trông như thế này:

public class MyClass { 
    void stuff() { 

    } 
} 

và lớp học chính của tôi:

using System; 
using MyClass; 

public class MyMainClass { 
    static void Main() { 
     MyClass test = new MyClass(); 
     /* Doesn't work */ 
    } 
} 

Tôi đã cố gắng để bao gồm lớp phi chính tôi với namespace MyNamespace { } và nhập khẩu đó, nhưng nó không làm việc.

+0

Bạn vượt qua các thư viện tạo ra như một đầu vào để trình biên dịch khi bạn biên dịch các lớp học chính, phải không? Ngoài ra, bạn sẽ có thể chuyển cả hai tệp nguồn với nhau tới trình biên dịch - không cần thư viện ở đây. – Alex

+0

Bạn đã thêm tệp khác (tệp mà 'MyClass' vào) vào giải pháp trong Visual studio chưa? –

+1

@ JensKloster Giải pháp nào? Studio trực quan nào? Tôi không sử dụng một IDE, tôi đang sử dụng dấu nhắc lệnh. – Bluefire

Trả lời

19

using chỉ dành cho không gian tên - nếu cả hai lớp nằm trong cùng một không gian tên, chỉ cần thả using.

Bạn cần phải tham khảo các lắp ráp tạo ra trong bước đầu tiên khi bạn biên dịch .exe:

csc /t:library /out:MyClass.dll MyClass.cs 
csc /reference:MyClass.dll /t:exe /out:MyProgram.exe MyMainClass.cs 

Bạn có thể làm cho mọi việc đơn giản hơn nếu bạn chỉ cần biên dịch các tập tin với nhau:

csc /t:exe /out:MyProgram.exe MyMainClass.cs MyClass.cs 

hoặc

csc /t:exe /out:MyProgram.exe *.cs 

EDIT: Đây là cách các tập tin sẽ giống như thế:

MyClass.cs:

namespace MyNamespace { 
    public class MyClass { 
     void stuff() { 

     } 
    } 
} 

MyMainClass.cs:

using System; 

namespace MyNamespace { 
    public class MyMainClass { 
     static void Main() { 
      MyClass test = new MyClass(); 
     } 
    } 
} 
+0

Nhưng khi tôi có cả hai trong cùng một không gian tên, nó mang lại cho tôi chính xác cùng một lỗi khi tôi cố gắng sử dụng nó. – Bluefire

+1

@Bluefire Đăng dòng lệnh mà bạn sử dụng để biên dịch chúng và nội dung của các tệp, bao gồm cả các không gian tên. – Alex

+1

Câu trả lời hay nhất vì nó thực sự cung cấp các dòng lệnh để biên dịch. Áp phích ban đầu sẽ phải quyết định xem anh ta muốn các lớp trong hai assembly riêng biệt (biên dịch một lớp thành thư viện (DLL), sau đó biên dịch lớp thứ hai thành thực thi với tham chiếu đến tệp DLL biên dịch đầu tiên) hay chỉ trong một assembly (biên dịch một lần với cả hai tệp). Đây là điều mà nhiều người quản lý bằng việc có "dự án" bên trong Visual Studio nơi mà các dự án tham chiếu lẫn nhau (theo cách không tròn) và mỗi dự án có thể nối tiếp một hoặc nhiều tệp mã. –

-1

Điều duy nhất bạn có thể làm là đặt cả hai người trong số họ vào cùng một không gian tên. Sau đó, bạn không cần phải nhập nó. Bạn có thể truy cập trực tiếp nó.

using System; 
namespace MyNamespace 
{ 
    public class SampleClass1 
    { 
     //Can access SampleClass2 here 
    } 
} 


using System; 
namespace MyNamespace 
{ 
    public class SampleClass2 
    { 
     //Can access SampleClass1 here 
    } 
} 

using System; 
namespace MyNamespace 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      //Can access both of above classes 
     } 
    } 
} 
+0

Bạn: _Điều duy nhất bạn có thể làm là đặt cả hai người trong cùng một không gian tên._ Không chính xác. Các loại trong các không gian tên khác nhau có thể tham chiếu lẫn nhau. Điều này không thực sự về không gian tên, nó là về việc biên dịch nhiều tệp mã từ dòng lệnh. Ngoài ra, khái niệm về không gian tên là trực giao với các khái niệm về các dự án/mô-đun/hội đồng. –

+0

@JeppeStigNielsen Xin lỗi vì sai lầm ngớ ngẩn của tôi ... nhưng câu hỏi đã được chỉnh sửa sau câu trả lời của tôi. Trước đây, nó đã được về cách sử dụng các lớp khác trong phương pháp chính và người hỏi đã được nhập khẩu các lớp học trực tiếp, do đó, nó là câu trả lời chính xác tại thời điểm đó .. Bạn có thể chỉnh sửa câu trả lời của tôi nếu sai tại bối cảnh hiện tại .. Cảm ơn bạn sir cho khái niệm trực giao .. !! –

1

Vâng, những gì bạn phải "nhập" (sử dụng) là không gian tên của MyClass không phải là tên lớp. Nếu cả hai lớp trong cùng một không gian tên, bạn không phải "nhập" nó.

Definition MyClass.cs

namespace Ns1 
{ 
    public class MyClass 
    { 
     ... 
    } 
} 

Cách sử dụng AnotherClass.cs

using Ns1; 

namespace AnotherNs 
{ 
    public class AnotherClass 
    { 
     public AnotherClass() 
     { 
      var myInst = new MyClass(); 
     } 
    } 
} 
0
namespace MyNamespace 
{ 
    public class MyMainClass 
    { 
     static void Main() 
     { 
      MyClass test = new MyClass(); 
     } 
    } 

    public class MyClass 
    { 
     void Stuff() 
     { 

     } 
    } 
} 

Bạn không có nhu cầu sử dụng một không gian tên sau đó bởi vì nó là tất cả encompased trong không gian tên tương tự.

Nếu bạn không chắc chắn về không gian tên lớp của bạn, hãy nhập lớp (trường hợp nhạy cảm bạn muốn sử dụng), sau đó với con trỏ trên lớp, hãy sử dụng CTRL + . và nó sẽ cung cấp cho bạn nhập thủ công.

0

MyClass là một lớp không phải là một namespace . Vì vậy, mã này sai:

using MyClass //THIS CODE IS NOT CORRECT 

Bạn nên kiểm tra không gian tên của MyClass (ví dụ: MyNamespace). Sau đó gọi nó theo cách thích hợp:

MyNamespace.MyClass myClass =new MyNamespace.MyClass(); 
0

using được sử dụng để nhập không gian tên không phải lớp học.

Vì vậy, nếu lớp học của bạn là trong namespace X

namespace X 
{ 
    public class MyClass { 
     void stuff() { 

     } 
    } 
} 

sau đó sử dụng nó trong không gian tên khác mà bạn muốn nó

using System; 
using X; 

public class MyMainClass { 
    static void Main() { 
     MyClass test = new MyClass(); 
    } 
} 
0

Nếu họ là các tập tin lớp riêng biệt trong cùng một dự án, sau đó bạn không cần phải có câu lệnh 'nhập'. Chỉ cần sử dụng lớp ngay lập tức. Nếu các tệp nằm trong các dự án riêng biệt, trước tiên bạn cần phải thêm tham chiếu vào dự án trước khi bạn có thể sử dụng câu lệnh 'nhập' trên đó.

1

Nếu lớp khác được biên soạn như một thư viện (ví dụ: dll) và đây là cách bạn muốn, bạn nên thêm một tham chiếu từ studio trực quan, duyệt và trỏ tới tệp dll.

Nếu những gì bạn muốn là để kết hợp các OtherClassFile.cs vào dự án của bạn, và không gian tên đã giống hệt nhau, bạn có thể:

  1. Đóng giải pháp của bạn,
  2. mở YourProjectName.csproj tập tin , và tìm kiếm phần này:

    <ItemGroup>            
        <Compile Include="ExistingClass1.cs" />      
        <Compile Include="ExistingClass2.cs" />         
        ... 
        <Compile Include="Properties\AssemblyInfo.cs" />  
    </ItemGroup> 
    
  1. Kiểm tra tệp .cs mà bạn muốn thêm nằm trong thư mục dự án (cùng thư mục với tất cả các lớp hiện có trong giải pháp).

  2. Thêm mục nhập bên trong như dưới đây, lưu và mở dự án.

    <Compile Include="OtherClassFile.cs" /> 
    

lớp học của bạn, bây giờ sẽ xuất hiện và cư xử như một phần của dự án. Không cần sử dụng.Điều này có thể được thực hiện nhiều tập tin trong một shot.

5

tôi biết đây là câu hỏi rất cũ nhưng tôi đã yêu cầu cùng một lúc và chỉ thám hiểm rằng sau khi C# 6 bạn có thể sử dụng tĩnh trong việc sử dụng cho các lớp học để nhập khẩu.

hy vọng điều này giúp một người nào đó ....

using static yourNameSpace.YourClass; 
Các vấn đề liên quan