hact 发表于 2010-12-1 13:50:27

C# 一个小错误不知道怎么解决

原代码如下,(.net2008 +autocad 2010)
函数定义为public ObjectId createLayer(),返回return layerId;编译成功,但CAD中加载后异常终止子
函数定义为public void createLayer(),无返回值,则正常运行

以上两种函数,若加入try……catch……finally之后(如注释),则编译通不过“使用了未赋值的变量layerId”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Colors;
namespace Lab1
{
    public class Class1
    {
      #region Create Layer
      
      public ObjectId createLayer()
      {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ObjectId layerId;
            Database db = HostApplicationServices.WorkingDatabase;
            Transaction tran;
            tran = db.TransactionManager.StartTransaction();
         
            //try
            //{
                LayerTable lt = (LayerTable)tran.GetObject(db.LayerTableId, OpenMode.ForWrite);
                if (lt.Has("EmployeeLayer"))
                {
                  layerId = lt["EmployeeLayer"];
                }
                else
                {
                  LayerTableRecord ltr = new LayerTableRecord();
                  ltr.Name = "EmployeeLayer";
                  ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2);
                  layerId = lt.Add(ltr);
                  tran.AddNewlyCreatedDBObject(ltr, true);
                }
                tran.Commit();
            //}
            //catch
            //{
                ed.WriteMessage("Error ");
            //}
            //finally
            //{
                tran.Dispose();
            //}
            return layerId;
      }
      #endregion
    }
}

雪山飞狐_lzh 发表于 2010-12-1 13:59:17

函数定义为public void createLayer()

去掉return layerId;

hact 发表于 2010-12-1 14:10:59

恩,直接void没有问题。
我想知道,若我要定义一个带ObjectId类型返回值的函数,应该怎么做啊

雪山飞狐_lzh 发表于 2010-12-1 14:21:58

命令函数,即带有CommandMethod属性的函数,只能是void
定义一个带ObjectId类型返回值的函数,那就去掉这个属性

hact 发表于 2010-12-1 14:39:12

o,原来如此,谢谢
try……catch……finally的问题咋办

雪山飞狐_lzh 发表于 2010-12-1 14:55:17

      public ObjectId createLayer()
      {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ObjectId layerId = ObjectId.Null;
            Database db = HostApplicationServices.WorkingDatabase;
            Transaction tran;
            tran = db.TransactionManager.StartTransaction();

            try
            {
                LayerTable lt = (LayerTable)tran.GetObject(db.LayerTableId, OpenMode.ForWrite);
                if (lt.Has("EmployeeLayer"))
                {
                  layerId = lt["EmployeeLayer"];
                }
                else
                {
                  LayerTableRecord ltr = new LayerTableRecord();
                  ltr.Name = "EmployeeLayer";
                  ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2);
                  layerId = lt.Add(ltr);
                  tran.AddNewlyCreatedDBObject(ltr, true);
                }
                tran.Commit();
            }
            catch
            {
                ed.WriteMessage("Error ");
            }
            finally
            {
                tran.Dispose();
            }
            return layerId;
      }

hact 发表于 2010-12-1 15:45:38

谢谢!
ObjectId layerId = ObjectId.Null;
我之前尝试写了ObjectId layerId = Null;出错,咋没想到呢。
页: [1]
查看完整版本: C# 一个小错误不知道怎么解决