书籍通常会说,如果课程太大而无法管理,请重新考虑实施,因为设计需要更正,因为课程尚未正确定义.
但是在类确实很大的情况下,例如当一个类被扩展以实现控件的功能时(例如Canvas),并且有许多不同的东西,如命中测试,绘图,管理绘制的项目等.在这种情况下使用部分类来分离更大容器(例如自定义控件)的"不同"事物是一个很好的解决方案吗?
其次,作为一个更普遍和更广泛的解决方案,在转向部分类之前应该考虑什么?
我正在进行的项目有很多部分类(意味着关键字'部分'已被使用),但如果它们实际上是偏向于任何东西,我不知道(我希望编译器会寻找其他部分(s) )如果没有找到,则抛出错误,但事实上它不会引发错误,这导致我的问题).
既然我没有办法告诉你,当创建一个局部类是否有其他'局部'或者没有引导我思考那些局部是否必须在同一个集合中?是否可以通过WCF或Web服务在程序集外部创建一个局部类 - 我不知道它在运行时如何工作(我想编译器会满意,因为它似乎并不关心)但我找不到任何明确的状态是或否.类似的问题解释说它不应该以这种方式使用,但实际上不能以这种方式使用.
我在我的Entity Framework(v5)对象上使用了一个部分类(.NET 4.5).我为此部分类添加了一个接口,但是针对此接口测试EF对象是错误的,但应该识别接口是在部分类上定义的.这是我正在尝试的:
public interface Product : ILastModified
{
public DateTime LastModified { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后在我的数据层我尝试这个:
public virtual int Update<T>(T TObject) where T : class
{
//WHY ALWAYS FALSE?
if (TObject is ILastModified)
{
(TObject as ILastModified).LastModified = DateTime.Now;
}
var entry = dbContext.Entry(TObject);
dbContext.Set<T>().Attach(TObject);
entry.State = EntityState.Modified;
return dbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
问题是"if(TObject是ILastModified)"总是假的,即使我在部分类上设置它.我做错了什么或有办法实现这样的事情吗?
我有以下代码:
public partial class Root : ICustomInterface
{
public virtual void Display()
{
Console.WriteLine("Root");
Console.ReadLine();
}
}
public class Child : Root
{
public override void Display()
{
Console.WriteLine("Child");
Console.ReadLine();
}
}
class Program
{
static void Main(string[] args)
{
Root temp;
temp = new Root();
temp.Display();
}
}
Output: "Root"
Desired output: "Child"
Run Code Online (Sandbox Code Playgroud)
当我实例化一个Root对象并调用该Display()方法时,我想显示重写方法,Child这是可能的.
我需要这个,因为我必须创建一个插件,该插件是基本代码的扩展Display(),并使Root类的方法无效并仅实现插件的方法Child
我想避免重新编译包含公共头文件的所有内容,只是因为在类定义的私有部分中发生了某些变化.我正在调查PIMPL旁边的其他选项.
这是我试过的:
我创建了一个包含A类的库:
A_p.h包含A类的私有部分
void PrivateMethod(int i);
Run Code Online (Sandbox Code Playgroud)
公共头文件啊:
class A
{
public:
A();
virtual ~A();
// other public members
private:
#ifdef A_PRIVATE
#include "A_p.h"
#endif
};
Run Code Online (Sandbox Code Playgroud)
A.cpp
#define A_PRIVATE
#include "A.h"
A::A() {}
A::~A() {}
void A::PrivateMethod(int i) { }
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个Win32控制台项目,其中包含公共标头(Ah)和针对.lib文件的链接.
一切似乎都有效,但我想知道沿途的任何陷阱.任何人都可以详细说明这个吗?
在C#中,密封的部分类的意义是什么?
Sealed类是一个无法继承的类.
部分类是可以在2个或更多源文件之间拆分的类.
那么为什么"密封的部分类有任何意义?
我使用的是 Entity Framework Core,生成的类有自己的属性,即
数据模型.Agent.cs
public partial class Agent {
public virtual decimal Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
但我需要其他属性,所以我在另一个文件中声明它们:
代理.cs
public partial class Agent
{
[NotMapped]
public dynamic Custom { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是Agent.cs是在DataModel.Agent.cs之前编译的,所以编译器按照这个顺序生成属性:Custom、Id、Name,结果JSON很奇怪。
我希望它是:ID、名称、自定义。换句话说,我总是希望 DataModel 类排在第一位。
编辑:澄清一下,唯一的目标是通过始终将 Id 放在首位来使 JSON 更漂亮,这是一种非常常见的模式。这对应用程序的工作方式绝对没有影响。
有没有办法强制编译器始终首先编译其中一个文件?
这是一个快速确认问题:
为了使部分类工作,我最初认为会有一个主类public class ManageDates,然后你会创建像public partial class ManageDates扩展ManageDates类的部分类.
但是从一些实验中,我发现如果你要使用部分类,必须声明每个单独的类public partial class [ClassName]......
我在这个结论中是否正确?
在过去的几个月里,我做了很多研究,但还没有真正找到我的问题的好答案:
一些背景信息:我是WPF的新手,并被要求使用它创建一个项目.我自己学习了大部分概念,但我正在努力解决一个主要问题.MainWindow课堂上的代码太多了.
代码太多的原因:代码太多,因为我的UI元素的所有事件都必须在这一个类中进行控制.
现在我刚刚发现了部分类的使用.所以我计划将事件拆分成一个单独的文件.我只是想知道是否有更好的方法来减少MainWindow班级的规模?我无法找到在类之间传递控件的方法,因为我知道在类或方法之间传递TextBoxes或ListBoxes等等是不好的.(但我确实知道你可以传递诸如textBox1.Text或类似属性之类的参数,但这并不能解决我的问题.
我正在使用C#编写ASP.NET MVC3.我收到如下错误
Type 'Test' already defines a member called 'Test' with the same parameter types
Run Code Online (Sandbox Code Playgroud)
我的代码是:
public partial class Test
{
Test()
{
//some code
}
}
public partial class Test
{
Test()
{
days = new List<SelectListItem>();
}
public IList<SelectListItem> days { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
两个类都在不同的文件中.
我不想修改第一个部分类.那么我怎样才能处理这种情况,我要两次调用相同的构造函数?
partial-classes ×10
c# ×9
.net ×1
asp.net ×1
c++ ×1
code-cleanup ×1
coding-style ×1
constructor ×1
inheritance ×1
interface ×1
overriding ×1
refactoring ×1
sealed ×1
wpf ×1