0

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

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

或作为一个值:

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

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

4

3 回答 3

1

就个人而言,我会使用第二种形式。我这样说是因为我使用由其他团队编写的框架,他们使用这种形式。

我相信这是因为它更干净,使用更少的空间,并且对于非作者来说更容易阅读。我尽量记住,最简洁的代码,同时仍然可以被对项目了解最少的人阅读是最好的。

此外,我没有遇到后一个示例在跨头文件、方法、类或数据文件等的可读性方面的任何问题。

尽管我与这方面的专家相差甚远,但这就是我更喜欢的。对我来说更有意义。

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 

例如

于 2012-07-02T15:04:04.217 回答
1

这一切都取决于寿命。当您有一个与所属类完全一样的私有成员时,第二种形式更可取。

于 2012-07-02T15:06:19.173 回答
1

在编写托管 C++ 代码时,我赞成遵循其他托管语言使用的约定。因此,我将使用类级别数据成员的句柄,并且仅在您使用usingC# 中的语句的地方使用值(堆栈语义)。

如果您的类成员是一个值,那么完全替换该对象意味着该对象需要定义一个复制构造函数,而 .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);
于 2012-07-02T23:31:44.007 回答