C ++ / CLI数据成员应该是句柄还是值?

时间:2012-07-02 14:57:31

标签: c++-cli

我是C ++ / CLI的新手,我想知道关于托管类型数据成员的“最佳实践”是什么。声明为句柄:

public ref class A {
public:
    A() : myList(gcnew List<int>()) {}
private:
    List<int>^ myList;
};

或作为值:

public ref class B {
private:
    List<int> myList;
};

似乎无法就此找到明确的建议。

3 个答案:

答案 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);