我是 C++/CLI 的新手,我想知道关于托管类型数据成员的“最佳实践”是什么。声明为句柄:
public ref class A {
public:
A() : myList(gcnew List<int>()) {}
private:
List<int>^ myList;
};
或作为一个值:
public ref class B {
private:
List<int> myList;
};
似乎无法找到关于此的明确建议。
我是 C++/CLI 的新手,我想知道关于托管类型数据成员的“最佳实践”是什么。声明为句柄:
public ref class A {
public:
A() : myList(gcnew List<int>()) {}
private:
List<int>^ myList;
};
或作为一个值:
public ref class B {
private:
List<int> myList;
};
似乎无法找到关于此的明确建议。
就个人而言,我会使用第二种形式。我这样说是因为我使用由其他团队编写的框架,他们使用这种形式。
我相信这是因为它更干净,使用更少的空间,并且对于非作者来说更容易阅读。我尽量记住,最简洁的代码,同时仍然可以被对项目了解最少的人阅读是最好的。
此外,我没有遇到后一个示例在跨头文件、方法、类或数据文件等的可读性方面的任何问题。
尽管我与这方面的专家相差甚远,但这就是我更喜欢的。对我来说更有意义。
class AlgoCompSelector : public TSelector {
public :
AlgoCompSelector( TTree *tree = 0 );
virtual ~AlgoCompSelector(){ /* */ };
virtual void Init(TTree *tree);
virtual void SlaveBegin(TTree *tree);
virtual Bool_t Process(Long64_t entry);
virtual void Terminate();
virtual Int_t Version() const { return 1; }
void setAlgo( Int_t idx, const Char_t *name, TTree* part2, TTree* part3 );
void setPTthres( Float_t val );
void setEthres( Float_t val );
private:
std::string mAlgoName[2]; // use this for the axis labels and/or legend labels.
TTree *mPart1;
TTree *mPart2[2], *mPart3[2]; // pointers to TTrees of the various parts
TBranch *mPhotonBranch[2]; // Used branches
TClonesArray *mPhotonArray[2]; // To point to the array in the tree
例如
这一切都取决于寿命。当您有一个与所属类完全一样的私有成员时,第二种形式更可取。
在编写托管 C++ 代码时,我赞成遵循其他托管语言使用的约定。因此,我将使用类级别数据成员的句柄,并且仅在您使用using
C# 中的语句的地方使用值(堆栈语义)。
如果您的类成员是一个值,那么完全替换该对象意味着该对象需要定义一个复制构造函数,而 .NET 类并不多。此外,如果要将对象传递给另一个方法,则需要使用%
运算符将 from 转换List<int>
为List<int>^
. (打字没什么大不了%
,但很容易忘记,编译器错误只是说它不能转换List<int>
为List<int>^
。)
//Example of the `%` operator
void CSharpMethodThatDoesSomethingWithAList(List<int>^ list) { }
List<int> valueList;
CSharpMethodThatDoesSomethingWithAList(%valueList);
List<int>^ handleList = gcnew List<int>();
CSharpMethodThatDoesSomethingWithAList(handleList);