关于List.Contains的问题

本文探讨了C#中List的Contains方法对于值类型和引用类型的处理方式。通过具体示例,展示了当对象为结构体时,Contains方法比较的是数据值;而当对象为类实例时,则比较的是对象的引用而非成员变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Contains比较的是对象还是数据?

public List<Vector3> xx = new List<Vector3> { new Vector3(-4.7f, -96), new Vector3(-4.7f, -136), new Vector3(-4.7f, -176), new Vector3(-4.7f, -216) };
public void Start()
{
    Vector3 x = xx[0];
    bool j = xx.Contains(x);
    Verctor3 y = new Vector3(-4.7f, -96);
    bool k = xx.Contains(x);
    x.x = 4;
    bool i = xx.Contains(x);
    Debug.Log(i + "" + j+""+k);
}

发现,i为false,j为true ,k为true。这里由于Vector3是结构体,属于值类型,所以比较数据。

然后又用一个类MyClass(中间只有一个int x成员)测试,发现比较的不是类成员,而是地址(或者是hashcode?)。因此,就算两个MyClass 对象 a 和 b 的成员x都为0,也是不想等的。

<think>我们正在讨论JavaScript中的classList.contains方法 这个方法用于检查元素是否包含指定的CSS类 语法:element.classList.contains(className) 其中,className是一个字符串,表示要检查的类名 返回值为布尔值:如果类存在则返回true,否则返回false 示例: 假设有一个按钮元素,其id为"stopsportbut",我们想检查它是否有"active"类 代码示例: const stopsportbut = document.getElementById('stopsportbut'); if (stopsportbut.classList.contains('active')) { // 如果包含'active'类,则执行某些操作 console.log('按钮处于活动状态'); } else { console.log('按钮未激活'); } 注意事项: 1. classList是只读属性,但可以使用add、remove、toggle等方法修改类列表 2. contains方法不会抛出错误,如果传入的参数不是字符串,它会尝试将其转换为字符串(通常不建议传入非字符串) 3. 如果元素不存在(即stopsportbut为null),则调用classList会报错,因此需要先确保元素存在 安全用法示例: const stopsportbut = document.getElementById('stopsportbut'); if (stopsportbut && stopsportbut.classList.contains('active')) { // 安全地检查 } 现在,根据要求,在回答末尾提出3-5个相关问题</think>### JavaScript `classList.contains()` 方法详解 #### 核心功能与语法 ```javascript // 方法签名 element.classList.contains(className) ``` - **className**:要检测的CSS类名字符串 - **返回值**:布尔值(`true`表示元素包含该类,`false`表示不包含) #### 实际应用场景 ```javascript // 获取按钮元素 const stopsportbut = document.getElementById('stopsportbut'); // 1. 条件样式操作 if (stopsportbut.classList.contains('disabled')) { stopsportbut.style.opacity = 0.5; stopsportbut.disabled = true; } // 2. 切换类状态 function toggleSportButton() { if (!stopsportbut.classList.contains('active')) { stopsportbut.classList.add('active'); stopsportbut.textContent = '运动已开启'; } else { stopsportbut.classList.remove('active'); stopsportbut.textContent = '开始运动'; } } // 3. 类存在性验证 console.log( stopsportbut.classList.contains('btn-primary') // 检测主要按钮样式 ); ``` #### 与相关方法对比 | 方法 | 功能 | 返回值 | 是否修改DOM | |---------------------|-----------------------------|---------|------------| | **contains()** | 检测类是否存在 | Boolean | 否 | | `add()` | 添加类 | void | 是 | | `remove()` | 移除类 | void | 是 | | `toggle()` | 切换类存在状态 | Boolean | 是 | | `replace()` | 替换类 | Boolean | 是 | #### 特殊案例处理 ```javascript // 1. 处理多个类名的情况 const hasMultipleClasses = stopsportbut.classList.contains('btn') && stopsportbut.classList.contains('large'); // 2. 动态类名检测 function checkDynamicClass(prefix) { return Array.from(stopsportbut.classList).some( cls => cls.startsWith(prefix) ); } // 3. 类名大小写敏感处理(CSS类名大小写不敏感) console.log( stopsportbut.classList.contains('ACTIVE') // 仍能匹配'active' ); // 4. 空值安全检测 if (stopsportbut?.classList?.contains('loading')) { showSpinner(); } ``` #### 性能优化建议 1. **避免重复检测**:将检测结果存入变量 ```javascript // 低效方式 if (stopsportbut.classList.contains('active')) { // 操作1... } if (stopsportbut.classList.contains('active')) { // 操作2... } // 高效方式 const isActive = stopsportbut.classList.contains('active'); if (isActive) { /* 操作1 */ } if (isActive) { /* 操作2 */ } ``` 2. **使用事件委托**:减少元素级检测 ```javascript // 父容器监听 document.getElementById('sports-panel').addEventListener('click', e => { if (e.target.classList.contains('sport-btn')) { handleSportSelect(e.target); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值