如何在c#中定义类之外的构造函数
本文关键字:构造函数 定义 | 更新日期: 2023-09-27 17:49:24
我是c#新手,刚刚从c++切换到c#。我在c++中做了这样的事情:
Class A
{
public : A(char *argv);//declaration of constructor
}
然后在main中我这样做:
int main(int argc, char **argv)
{
A Obj(argv[1]);
}
那么构造函数的定义我是这样做的:
A::A(char * argv)
{
//Here i use this command line argument argv which contains a file.
}
我尝试用c#编写等价的代码,如下所示:
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace shekhar_final
{
class Huffman
{
public int data_size,length,i,is_there, total_nodes;
string code;
Huffman(char *args);
}
public Huffman(char *args) //called from MyClass Line:16
{
using (var stream = new BinaryReader(System.IO.File.OpenRead(args[0]))) //Line : 18
{
while (stream.BaseStream.Position < stream.BaseStream.Length)
{
byte processingValue = stream.ReadByte();
}
}
}
public class MyClass
{
public static void Main(string[] args)
{
Huffman ObjSym =new Huffman(args);//object creation
}
}
}// Line:34
我得到的一对错误是://我已经指出了与我的代码中的错误相对应的行
shekhar_c#.cs(16,25): error CS1525: Unexpected symbol `Huffman', expecting `class', `delegate', `enum', `interface', `partial', or `struct'
shekhar_c#.cs(18,33): error CS1530: Keyword `new' is not allowed on namespace elements
shekhar_c#.cs(18,36): error CS1525: Unexpected symbol `BinaryReader', expecting `class', `delegate', `enum', `interface', `partial', or `struct'
shekhar_c#.cs(18,79): warning CS0658: `value' is invalid attribute target. All attributes in this attribute section will be ignored
shekhar_c#.cs(34,1): error CS8025: Parsing error
Compilation failed: 4 error(s), 1 warnings
你能帮我写c#等效的c++(删除这些错误)吗?额外的指导也很受欢迎,因为我是c#的初学者。
与c++不同,你可以选择在头文件中结合声明和成员函数的定义,或者将声明放在头文件中,并将实现放在cpp文件中,而c#没有这样的选择:如果函数有函数体(即它不是抽象的),则该函数体需要成为声明的一部分:
class Huffman
{
public int data_size,length,i,is_there, total_nodes;
string code;
Huffman(string args) {
using (var stream = new BinaryReader(System.IO.File.OpenRead(args)))
{
while (stream.BaseStream.Position < stream.BaseStream.Length)
{
byte processingValue = stream.ReadByte();
}
}
}
}
在c#中,声明和实现是一起的:
namespace shekhar_final
{
class Huffman
{
public int DataSize {get; set;}
public int Length {get; set;}
public int I {get;set;}
public int IsThere {get;set;}
public int TotalNodes {get;set;}
private string code;
public Huffman(string[] args) //called from MyClass Line:16
{
using (var stream = new BinaryReader(System.IO.File.OpenRead(args[0]))) //Line : 18
{
while (stream.BaseStream.Position < stream.BaseStream.Length)
{
byte processingValue = stream.ReadByte();
}
}
}
}
public class MyClass
{
public static void Main(string[] args)
{
Huffman objSym = new Huffman(args);//object creation
}
}
}// Line:34
在c#中不需要提前定义方法——它们是在类本身中定义的。试试这个:
class Huffman
{
public int data_size,length,i,is_there, total_nodes;
string code;
public Huffman(char *args) //called from MyClass Line:16
{
using (var stream = new BinaryReader(System.IO.File.OpenRead(args[0]))) //Line : 18
{
while (stream.BaseStream.Position < stream.BaseStream.Length)
{
byte processingValue = stream.ReadByte();
}
}
}
}
public class MyClass
{
public static void Main(string[] args)
{
Huffman ObjSym =new Huffman(args); //Here is the error
}
}
c#和c++的主要原理是不同的。在c++中,你有一个头文件和一个实现文件。在c#中,一切都需要在类中。因此,您可以声明类的构造函数,并将实现放在其中。
class funny {
public funny() {
... add your constructor stuff here
}
... other stuff ...
}
c#要求在类中定义构造函数:
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace shekhar_final
{
public class Huffman{
public int data_size,length,i,is_there, total_nodes;
string code;
public Huffman(string[] args) //called from MyClass Line:16
{
using (var stream = new BinaryReader(System.IO.File.OpenRead(args[0]))) //Line : 18
{
while (stream.BaseStream.Position < stream.BaseStream.Length)
{
byte processingValue = stream.ReadByte();
}
}
}
}
public class MyClass
{
public static void Main(string[] args)
{
Huffman ObjSym =new Huffman(args);//object creation
}
}
}// Line:34
在c#中你不分离声明和定义。c#中没有声明这样的概念,因为所有类型都存在于一个程序集中。如果您希望在c3中为类使用多个文件,您可以使用部分类的概念。