我是C ++ / CLI的新手,我想知道关于托管类型数据成员的“最佳实践”是什么。声明为句柄:
public ref class A {
public:
A() : myList(gcnew List<int>()) {}
private:
List<int>^ myList;
};
或作为值:
public ref class B {
private:
List<int> myList;
};
似乎无法就此找到明确的建议。
答案 0 :(得分:1)
就个人而言,我会使用第二种形式。我这样说是因为我使用的是其他团队编写的框架,他们使用这种形式。
我相信这是因为它更干净,占用空间更少,非作者更容易阅读。我试着记住最简洁的代码,同时仍然是对项目知之甚少的人可读。
另外,在头文件,方法,类或数据文件的可读性方面,我没有遇到后一个例子的任何问题......等等。
虽然我是专家的 FAR ,但我更喜欢这样。对我来说更有意义。
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
例如
答案 1 :(得分:1)
这一切都取决于寿命。如果你的私人成员的生活时间与拥有类一样长,那么第二种形式更可取。
答案 2 :(得分:1)
在编写托管C ++代码时,我赞成遵循其他托管语言使用的约定。因此,我将使用类级数据成员的句柄,并且只使用在C#中使用using
语句的值(堆栈语义)。
如果您的类成员是一个值,那么完全替换该对象意味着该对象需要定义一个复制构造函数,而不是很多.NET类。此外,如果要将对象传递给另一个方法,则需要使用%
运算符将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);