C# 常用特性

AllowAnonymous

在ASP.NET Core的上下文中,AllowAnonymous是一个属性,通常用于ASP.NET Core的控制器或动作方法。这个属性告诉ASP.NET Core框架,这个控制器或动作方法不需要身份验证或授权。换句话说,任何人都可以访问这个控制器或方法,无需提供用户凭据。

例如,假设你有一个公开的API端点,你想让任何人都可以访问它,那么你可以在控制器或动作方法上使用AllowAnonymous属性:

[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
    // 这个动作方法允许匿名访问
    [HttpGet]
    [AllowAnonymous]
    public IActionResult Get()
    {
        // ... 返回一些数据 ...
    }
}

NotMapped

在上面的例子中,Get方法上的AllowAnonymous属性告诉ASP.NET Core该方法可以被任何人访问,而无需任何形式的身份验证或授权。

NotMapped是一个数据注解(Data Annotation)或者是一个Fluent API方法,在Entity Framework (特别是Entity Framework Core)中被用来指示某个属性不应当映射到数据库中。当你希望一个属性仅在对象关系映射(ORM)的实体类中存在,但不参与数据库表的生成时,你可以使用NotMapped

例如,考虑以下实体类:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    
    [NotMapped]
    public string PasswordHash { get; set; }
}

在上面的例子中,PasswordHash属性使用NotMapped注解来表明它不应映射到数据库。因此,当执行数据库迁移时,EF Core将不会为PasswordHash属性创建数据库列。

你还可以在Fluent API中使用HasNoKeyIgnore方法来达到相同的效果:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>().HasNoKey().Ignore(it => it.PasswordHash);
    base.OnModelCreating(modelBuilder);
}

Serializable

使用Fluent API来配置映射意味着你有更灵活的控制力,尤其是在处理复杂映射和数据库上下文中的多种实体类型时。

"Serializable"通常与对象的序列化有关,这是将对象的状态转换为字节序列的过程,以便于保存到文件、通过网络发送或进行其他形式的持久化。在.NET中,Serializable属性标记一个类型,告诉运行时该类型可以被序列化。

一个类型实现了Serializable属性之后,它的实例可以被序列化。这意味着对象可以被转换为字节流,然后可以将其写入文件或通过网络发送。反序列化是序列化的逆过程,它将字节流转换回对象。

例如,在C#中,你可以使用以下方式标记一个类型为可序列化的:

[Serializable]
public class MySerializableClass
{
    // ... 类成员 ...
}

MaxLength

一旦一个类型被标记为可序列化,就可以使用BinaryFormatter类或其他序列化机制将其实例保存到文件或通过网络发送。

需要注意的是,标记为Serializable的类型必须满足一定的要求,例如所有的非静态字段必须是可序列化的,否则在尝试序列化时会抛出异常。此外,实现Serializable属性并不意味着该类型必须实现特定的接口,它只是告诉运行时该类型可以被序列化。实际的序列化和反序列化操作可能需要使用特定的类和方法来完成。

在C#中,MaxLength 属性通常用于 System.Windows.Forms.TextBox 控件中,它定义了文本框中允许输入的最大字符数。如果你在Windows窗体应用程序中使用文本框控件,并希望限制用户可以输入的字符数量,可以使用这个属性。

例如:

// 创建一个新的TextBox控件
TextBox textBox = new TextBox();

// 设置MaxLength属性为10,这意味着用户只能输入最多10个字符
textBox.MaxLength = 10;

// 设置TextBox的Text属性来初始化它
textBox.Text = "Initial text";

// 将TextBox添加到窗体的控件集合中
this.Controls.Add(textBox);

如果你是在谈论数据注解中的 MaxLength,它用于指定数据模型属性中字符串的最大长度。这在数据验证和模型绑定时非常有用。例如:

using System.ComponentModel.DataAnnotations;

public class MyModel
{
    [MaxLength(10)] // 字符串的最大长度为10个字符
    public string MyProperty { get; set; }
}

在上面的例子中,任何尝试将超过10个字符的字符串赋值给 MyProperty 的操作都会导致验证错误。

UnitOfWork

UnitOfWork 是一个设计模式,用于确保数据的完整性和一致性。它通常在业务层中使用,用于管理数据库事务,确保多个操作要么全部成功,要么全部失败。UnitOfWork模式常与Repository模式一起使用,Repository 负责数据访问,而 UnitOfWork 负责事务管理。

在C#中实现UnitOfWork模式时,通常会创建一个类来管理数据库连接和事务,并提供方法来执行各种数据库操作。下面是一个简单的示例:

public class UnitOfWork : IUnitOfWork
{
    private readonly MyDbContext _context;
    private bool _disposed;
    private DbTransaction _transaction;

    public UnitOfWork(MyDbContext context)
    {
        _context = context;
    }

    public int SaveChanges()
    {
        return _context.SaveChanges();
    }

    public void BeginTransaction()
    {
        _transaction = _context.Database.BeginTransaction();
    }

    public void Commit()
    {
        _context.Database.CommitTransaction();
        _transaction = null;
    }

    public void Rollback()
    {
        _context.Database.RollbackTransaction();
        _transaction = null;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                if (_transaction != null) _transaction.Dispose();
            }
            _disposed = true; // 避免再次被调用Dispose()或终结器(Finalizer)回收资源。
        }
    }
}

在这个例子中,IUnitOfWork 是一个接口,定义了 UnitOfWork 类需要实现的方法。MyDbContext 是你的数据库上下文类,它实现了 DbContext 类。DbTransaction 是数据库事务对象,用于管理数据库事务。在 UnitOfWork 类中,实现了 Dispose 方法来释放资源,并在 Dispose 方法中调用了 Rollback 方法来回滚事务。如果不需要手动管理资源,可以使用 using 语句来自动调用 Dispose 方法,如下所示:

using (var unitOfWork = new UnitOfWork(myDbContext))
{
    // 执行数据库操作...
} // 这里会自动调用 Dispose 方法来释放资源并回滚事务。
  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是几个 C#常用特性及其用法: 1. Lambda 表达式:Lambda 表达式是一种轻量级的匿名函数,可以用于简化代码。例如,使用它来筛选一个列表中的元素: ``` var numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = numbers.Where(n => n % 2 == 0); ``` 2. LINQ:LINQ(Language Integrated Query)是一种强大的查询语言,可以用于对集合、数据库和 XML 等数据源进行查询。例如,使用 LINQ 查询一个列表中的元素: ``` var numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = from n in numbers where n % 2 == 0 select n; ``` 3. 泛型:泛型是一种可以在编译时指定类型的特性,可以用于提高代码的类型安全性和重用性。例如,定义一个泛型类: ``` public class Stack<T> { private List<T> items = new List<T>(); public void Push(T item) { items.Add(item); } public T Pop() { T item = items[items.Count - 1]; items.RemoveAt(items.Count - 1); return item; } } ``` 4. 异步/await:异步/await 是一种用于编写异步代码的特性,可以让程序在执行异步操作时不会被阻塞。例如,使用异步/await 来调用 Web API: ``` public async Task<string> GetWeatherAsync() { using (var client = new HttpClient()) { var response = await client.GetAsync("http://api.weather.com/weather"); var content = await response.Content.ReadAsStringAsync(); return content; } } ``` 以上是几个 C#常用特性及其用法,希望对你有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支一支杨桃枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值